/
dagbok.txt
160 lines (143 loc) · 7.34 KB
/
dagbok.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
2013-04-11
----------
Först tänkte jag att att man skulle kunna representera anropskedjan som listor
i listor i listor (osv.). Detta sätt att göra det på skulle bli väldigt
jobbigt att hålla reda på. Jag kollade därför projektsidorna efter
information om hur man skulle kunna göra, och kom fram till att ett
träd givetvis är en bra datastruktur att använda sig av.
2013-04-12
----------
Inga framsteg idag, funderade mest över hur man gör med trädstrukturen och
scope. Jag är ganska säker på att jag förstår hur man gör nu, så
förhoppningsvis blir det större framsteg nästa gång.
2013-04-15
----------
Påbörjade skapandet av noder, det är ännu oklart hur man ska hantera scope och
liknande. Förhoppningsvis går det systemet relativt enkelt att
integrera sen i koden.
2013-04-16
----------
Jag har skapat ett Scope-objekt som ska innehålla både variabler och funktioner.
2013-04-19
----------
Lagt till parametern scope till alla eval-funktioner(utom för ProgramNode),
samt börjat ändra lite i PrintNode.
2013-04-22
----------
Scope har nu uppdaterats för dynamiskt scope. Eftersom Scope nu även håller reda
på vilken dess förälder är så blir det (förhoppningsvis) enkelt att
iterera bakåt genom Scope och hitta variabeln man letar efter.
2013-04-23
----------
Jag skapade idag en get_val()-funktion som ska underlätta för de funktioner
som behöver komma åt olika slags värden från variabler. Den ser enkel ut
men förhoppningsvis kan den hjälpa mig att göra det lätt att ändra på
saker och ting sen.
2013-04-24
----------
Dagen har ägnats åt att fixa till ytterligare några detaljer i Scope.
Därefter började jag fixa till alla de olika noderna och dess beteende.
Tyvärr känns det som att det kanske kan bli problem senare med att
ex. uppdatera variabler. Förhoppningsvis fungerar det som
jag tänkt och inga problem uppstår.
2013-04-25
----------
Idag har det gått väldigt bra, det känns som att det Scope jag skapat
kommer att kunna fungera även i praktiken. Ett problem är hur jag
ska hantera return-satser. En lösning är ju givetvis att varje ställe
där en return-nod är att förvänta kolla om det är en return-nod,
och isåfall helt enkelt returnera det uttryck den har i sig.
Det är väll inte den direkt snyggaste lösningen, men den bör fungera.
IdentifierNode borde inte spara typ och data, utan använda sig av typen för
att skapa ett nytt objekt av ``korrekt'' typ.
2013-04-26
----------
Gjorde om variabelnoderna så att de ärver av en gemensam value-node. Detta
städade upp en del duplicerad kod vilket var trevligt. Detta gör det
även enklare att ändra på variabelnoderna om så krävs. Den enda nod
som inte fick någon ändring var IdentifierNode som ju är lite speciell.
Jag har nu fixat till IndentifierNode samt value_to_bool(). Den sistnämnda
är inte direkt jättebra men den underlättar hanteringen i de olika
Boolean-noderna senare.
Alla noder är nu i princip klara, och det återstår väll en del finputs.
Det saknas även en konstruktion ``break'' för att hoppa ur loopar,
så denna behöver fixas till.
Nu är de unära och binära operatorerna konsoldierade så de ärver från en
gemensam basklass. Denna använder sedan metoden ``send'' för att utföra
den korrekta operationen.
Kul att notera: De unära operationerna - och + heter internt -@ respektive
+@ i Ruby.
Vid en simpel testkörning hittade jag några småfel i koden som jag sedan rättade
till. Det handlade mest om att jag inte evaluerade argument på rätt ställen.
Att göra: en IdentifierNameNode som bara innehåller variabelnamn utan värde.
2013-04-29
----------
Tog bort en dubblett av InsertNode. NameNode är nu skapad och den innehåller
endast ett variabelnamn.
Jag skapade NameNode som nu används överallt för att representera variabelnamn.
Jag fick även implementera metoderna eql?() och hash() för att uppslagningen
i hashtabellen för variabelnamn skulle fungera.
Passade på att göra om de booleska klasserna så de ärver av en gemensam klass.
Jag har även fixat till AtNode, InsertNode, PrintNode och InputNode nu så att
de fungerar. Arbetet fortsätter med fler listnoder. Därefter ska parsern
integereras.
2013-04-30
----------
Integerade parsern med klasserna.
Vissa enklare saker funkar, som variabeldeklaration och if-satser
med ett villkor utan extra elseif/else.
2013-05-02
----------
If-Elseif-Else-grenar fungerar nu. Tack till Per för hans upptäckt av en
smidig lösning.
Räkningen fixades till genom att ändra lite på ordningen hos matchningarna.
Fixade till så att program med endast ett statement fungerade.
Föregående fix resulterade i att ordningen på alla statements blev fel.
While-satser funkar nu. Tilldelning av variabler fungerar även det.
While-satserna har uppdaterats för att faktiskt kunna hantera jämförelser
och liknande. Tidigare har det blivit lite konstiga fel, exempelvis
har den gått ett steg för långt.
2013-05-03
----------
Lyckades fixa till en massa problem rörande de egna klasserna.
Städade upp i RemoveNode så att den faktiskt fungerar utan index.
For-loopar fungerar inte korrekt numera, uppåt går bra men nedåt så funkar det
inte riktigt som det ska.
Fixade till AtNode samt InsertNode. InsertNode evaluerar nu sitt argument innan
det stoppas in i listan.
For-loopen visade sig fungera bra vid närmare eftertanke. Den la till upp till
index 10, men tog bort ner till index 1.
Har implementerat get_type i NameNode som returnerar namnets typ.
Funktioner har implementerats och verkar vid ett preliminärt test fungera
korrekt.
2013-05-06
----------
to_s i ValueNode visade sig innehålla ett ``litet'' fel: den returnerade inte en
sträng utan ett objekt.
Fixade till så att debugutskrifter endast exekveras om $debug är satt till true.
2013-05-07
----------
Jämförelser med BinaryComparisonNode fungerade inte korrekt eftersom
operatorerna inte evaluerades innan jämförelsen.
Lade till get_val() som returnerar en datatyp inbyggd i Ruby.
Skapade BooleanNode vars syfte är att "wrappa" expressions i if-satser.
return bör fungera nu, men det blev inte särskilt snyggt. Man kan heller inte
nästla funktionsanrop.
Grammatiken kanske har blivit lite konstig, så jag commitar så man enklare kan
jämföra senare.
2013-05-08
----------
Försöker fixa return i if-satser. Går sådär.
Insåg just att det skulle bli väldigt mycket jobb pga. av scopeningen.
Först tänkte jag att man kunde returnera true från alla inbyggda funktioner när
de är klara och isåfall se om de inte returnerade true. Denna lösning bör
fungera, men blir inte särskilt snygg.
Därefter tänkte jag att man kan returnera själva ReturnNode, men då finns det
en möjlighet att man inte kan evaluera den eftersom man då förlorar de
scope som fanns där tidigare.
Man skulle kunna tänka sig att man först evaluerar uttrycket, och returnerar
en ny ReturnNode med värdet.
En tredje möjlighet är att returnera symboler och spara returvärdet i en global
variabel men jag tycker inte att det verkar som en snygg lösning alls.
En fjärde jättedålig möjlighet är att kasta ett exception med det värde som ska
returneras och sen fånga det.