Skip to content

Commit d5f79d1

Browse files
committed
Added Vector structures
1 parent 07a1f1e commit d5f79d1

File tree

10 files changed

+545
-4
lines changed

10 files changed

+545
-4
lines changed

examples/c/main.gsm

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
pi := 31416
3+
pi2 := pi
4+
5+
helloWorld := "Hello World!"
6+
another := helloWorld
7+
8+
printHelloWorld := function() {
9+
printHelloWorld()
10+
}
11+
12+
blubber := function() -> int
13+
main := function() -> int {
14+
printHelloWorld()
15+
}
16+
17+
// add of type function(int, int, int)
18+
add := function(a: int, b: int) -> int {
19+
a + b
20+
}

examples/c/out.a

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include <stdio.h>
2+
const int pi = 31416;
3+
const int pi2 = pi;
4+
void printHelloWorld() {
5+
printHelloWorld();
6+
}
7+
int blubber();
8+
int main() {
9+
printHelloWorld();
10+
}

examples/c/toolchain/after.gsm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
3+
}

examples/c/toolchain/before.gsm

Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
int + int ::= $ADD($1, $2)
2+
int - int ::= $SUB($1, $2)
3+
int * int ::= $MUL($1, $2)
4+
int / int ::= $DIV($1, $2)
5+
int % int ::= $MOD($1, $2)
6+
int >> int ::= $SHR($1, $2)
7+
int << int ::= $SHL($1, $2)
8+
int & int ::= $BWA($1, $2)
9+
int | int ::= $BWO($1, $2)
10+
string + string ::= $CAT($1, $2)
11+
string + int ::= $CAT($1, $2)
12+
int + string ::= $CAT($1, $2)
13+
int == int ::= {
14+
$EQUALS($1, $2)
15+
}
16+
string == string ::= $EQUALS($1, $2)
17+
int > int ::= $GREATER($1, $2)
18+
int < int ::= $GREATER($2, $1)
19+
(-int) ::= $SUB(0, $1)
20+
(+int) ::= $1
21+
string(int) ::= $CHAR($1, $2)
22+
symbol -> (*) ::= $LAMBDA($1, $2)
23+
24+
namespace ::= $TYPEDEF(0, namespace)
25+
26+
namespace{*} ::= {
27+
$TYPEDEF($QUOTE($2), Namespace)
28+
}
29+
30+
ConsCell + ConsCell ::= {
31+
appending ::= $2
32+
traverser ::= $LAMBDA(x, {
33+
$IF($TYPEOF(x, Nil), {
34+
appending
35+
}, {
36+
$CONS($CAR(x), traverser($CDR(x)))
37+
})
38+
})
39+
traverser($QUOTE($1))
40+
}
41+
42+
Namespace.(*) ::= {
43+
body ::= $UNTYPE($1)
44+
comb ::= body + $CONS($QUOTE($2), $NIL())
45+
$EVAL(comb)
46+
}
47+
48+
Namespace(*) ::= $1 . ($2)
49+
Namespace{*} ::= $1 . ($2)
50+
51+
include ::= $LOAD
52+
53+
import ::= $TYPEDEF(0, import)
54+
import(string) ::= namespace {
55+
include($2)
56+
}
57+
58+
ConsCell(int) ::= $IF($2 < 1, $CAR($QUOTE($1)), $CDR($QUOTE($1))($2-1))
59+
60+
$WRITELN ::= x -> $WRITE(x + "\n")
61+
$WRITEB2 ::= x -> {
62+
$WRITEB((x >> 8) & 255)
63+
$WRITEB(x & 255)
64+
}
65+
$WRITEB4 ::= x -> {
66+
$WRITEB((x >> 24) & 255)
67+
$WRITEB((x >> 16) & 255)
68+
$WRITEB((x >> 8) & 255)
69+
$WRITEB(x & 255)
70+
}
71+
$WRITEB8 ::= x -> {
72+
$WRITEB((x >> 56) & 255)
73+
$WRITEB((x >> 48) & 255)
74+
$WRITEB((x >> 40) & 255)
75+
$WRITEB((x >> 32) & 255)
76+
$WRITEB((x >> 24) & 255)
77+
$WRITEB((x >> 16) & 255)
78+
$WRITEB((x >> 8) & 255)
79+
$WRITEB(x & 255)
80+
}
81+
82+
string :=@ (*) ::= $DEF($1, $2)
83+
string =@@ (*) ::= $SET($1, $2)
84+
@@string ::= $GET($1)
85+
86+
// VECTORS:
87+
88+
$vec ::= $LAMBDA(size, $VECTOR(size))
89+
Vector(int) ::= $VECTOR_GET($1, $2)
90+
Vector <- (*) ::= $TYPEDEF($CONS($1, $2), VectorSet)
91+
VectorSet for int ::= {
92+
vector ::= $CAR($UNTYPE($1))
93+
value ::= $CDR($UNTYPE($1))
94+
index ::= $2
95+
$VECTOR_SET(vector, index, value)
96+
vector
97+
}
98+
?Vector ::= $VECTOR_LEN($1)
99+
Vector scale int ::= $VECTOR_RESIZE($1, $2)
100+
101+
// SEQUENCES:
102+
103+
// EMPTY SEQUENCE:
104+
_seq ::= $TYPEDEF($NIL(), _EmptySeq)
105+
(?_EmptySeq) ::= 0
106+
(!_EmptySeq) ::= $NIL()
107+
108+
// CREATING
109+
_EmptySeq,(*) ::= $TYPEDEF($CONS(1, $CONS($2, $NIL())), _Seq)
110+
(?_Seq) ::= $CAR($UNTYPE($1))
111+
(!_Seq) ::= $CDR($UNTYPE($1))
112+
113+
// APPENDING
114+
_Seq,(*) ::= {
115+
len ::= ?$1
116+
list ::= !$1
117+
element ::= $2
118+
inserter ::= x -> {
119+
$IF($TYPEOF(x, Nil), {
120+
$CONS(element, $NIL())
121+
}, {
122+
$CONS($CAR(x), inserter($CDR(x)))
123+
})
124+
}
125+
$TYPEDEF($CONS(len+1, inserter(list)), _Seq)
126+
}
127+
128+
// INDEXING
129+
_Seq(int) ::= {
130+
list ::= !$1
131+
index ::= $2
132+
selector ::= i -> (x -> {
133+
$IF(i < 1, $CAR(x), selector(i-1)($CDR(x)))
134+
})
135+
selector(index)(list)
136+
}
137+
138+
(~_Seq) ::= $IF((?$1 - 1) < 1, _seq, $TYPEDEF($CONS(?$1 - 1, $CDR(!$1)), _Seq))
139+
(*_Seq) ::= $CAR(!$1)
140+
(~_EmptySeq) ::= _seq
141+
(*_EmptySeq) ::= _seq
142+
143+
// MAPPING FUNC
144+
_Seq map (*) ::= {
145+
list ::= !$1
146+
len ::= ?$1
147+
f ::= $2
148+
mapper ::= x -> {
149+
$IF($TYPEOF(x, Nil), {
150+
$NIL()
151+
}, {
152+
$CONS(f($CAR(x)), mapper($CDR(x)))
153+
})
154+
}
155+
156+
$TYPEDEF($CONS(len, mapper(list)), _Seq)
157+
}
158+
159+
_Seq replace int ::= $TYPEDEF($CONS($1, $2), _SeqReplace)
160+
_SeqReplace with (*) ::= {
161+
element ::= $2
162+
replaceStatement ::= $UNTYPE($1)
163+
seq ::= $CAR(replaceStatement)
164+
len ::= ?seq
165+
index ::= $CDR(replaceStatement)
166+
167+
"i" :=@ 0
168+
169+
seq map x -> {
170+
result ::= $IF(@@"i" == index, element, x)
171+
"i" =@@ @@"i" + 1
172+
result
173+
}
174+
}
175+
176+
string map (*) ::= {
177+
len ::= $STRLEN($1)
178+
str ::= $1
179+
f ::= $2
180+
mapper ::= i -> {
181+
$IF(i == len, {
182+
""
183+
}, {
184+
$STR(f(str(i))) + mapper(i+1)
185+
})
186+
}
187+
188+
mapper(0)
189+
}
190+
191+
string foreach (*) ::= {
192+
len ::= $STRLEN($1)
193+
str ::= $1
194+
f ::= $2
195+
mapper ::= i -> {
196+
$IF(i == len, {
197+
""
198+
}, {
199+
f(str(i))
200+
mapper(i+1)
201+
})
202+
}
203+
204+
mapper(0)
205+
}
206+
207+
_EmptySeq map (*) ::= {}
208+
209+
210+
_map ::= $TYPEDEF($NIL(), _EmptyMap)
211+
212+
_EmptyMap{*} ::= {
213+
"_MAPBUILDER" :=@ _seq
214+
215+
// DEFINE SYNTAX
216+
string:(*) ::= {
217+
"_MAPBUILDER" =@@ (@@"_MAPBUILDER"), $CONS($1, $2)
218+
}
219+
220+
// EVAL ARGUMENT
221+
$EVAL($QUOTE($2))
222+
223+
// RETURN MAP
224+
$TYPEDEF(@@"_MAPBUILDER", _Map)
225+
}
226+
227+
(?_EmptyMap) ::= 0
228+
(?_Map) ::= ?($UNTYPE($1))
229+
(.._Map) ::= $UNTYPE($1) map x -> $CDR(x)
230+
(.._EmptyMap) ::= _seq
231+
232+
_Map{*} ::= {
233+
map ::= $1
234+
"_MAPBUILDER" :=@ $UNTYPE($1)
235+
236+
// DEFINE SYNTAX
237+
string:(*) ::= {
238+
index ::= (map?$1)
239+
$IF(index == -1, {
240+
"_MAPBUILDER" =@@ (@@"_MAPBUILDER"), $CONS($1, $2)
241+
}, {
242+
"_MAPBUILDER" =@@ ((@@"_MAPBUILDER") replace index with $CONS($1, $2))
243+
})
244+
}
245+
246+
// EVAL ARGUMENT
247+
$EVAL($QUOTE($2))
248+
249+
// RETURN MAP
250+
$TYPEDEF(@@"_MAPBUILDER", _Map)
251+
}
252+
253+
_Map(string) ::= {
254+
seq ::= $UNTYPE($1)
255+
256+
$IF($TYPEOF(seq, _EmptySeq), {
257+
$NIL()
258+
}, {
259+
head ::= *seq
260+
$IF($CAR(head) == $2, {
261+
$CDR(head)
262+
}, {
263+
($TYPEDEF(~seq, _Map))($2)
264+
})
265+
})
266+
}
267+
268+
269+
_EmptyMap?string ::= -1
270+
271+
_Map?string ::= {
272+
seq ::= $UNTYPE($1)
273+
len ::= ?seq
274+
searching ::= $2
275+
276+
seacher ::= i -> {
277+
$IF(i == len, {
278+
-1
279+
}, {
280+
$IF(searching == $CAR(seq(i)), {
281+
i
282+
}, {
283+
seacher(i+1)
284+
})
285+
})
286+
}
287+
288+
seacher(0)
289+
}
290+
291+
include("toolchain/language.gsm")

0 commit comments

Comments
 (0)