author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
Sun, 07 Oct 2012 22:29:10 -0400 | |
changeset 324 | aaedb3bcc2ea |
parent 155 | 55b1a3a813eb |
permissions | -rw-r--r-- |
155
55b1a3a813eb
Expand namespaces during parse step
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
150
diff
changeset
|
1 |
namespace s = "http://eighty-twenty.org/etng/r1/ns/stream#"; |
55b1a3a813eb
Expand namespaces during parse step
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
150
diff
changeset
|
2 |
namespace n = "http://eighty-twenty.org/etng/r1/ns/number#"; |
55b1a3a813eb
Expand namespaces during parse step
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
150
diff
changeset
|
3 |
namespace repl = "http://eighty-twenty.org/etng/r1/ns/repl#"; |
55b1a3a813eb
Expand namespaces during parse step
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
150
diff
changeset
|
4 |
namespace socket = "http://eighty-twenty.org/etng/r1/ns/socket#"; |
55b1a3a813eb
Expand namespaces during parse step
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
150
diff
changeset
|
5 |
namespace string = "http://eighty-twenty.org/etng/r1/ns/string#"; |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
6 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
7 |
define :true = <.:true>; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
8 |
define :false = <.:false>; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
9 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
10 |
define :repeat block = |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
11 |
do block(); |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
12 |
:repeat block; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
13 |
|
125
aa741ba92190
Define reverse in terms of foldl
Tony Garnock-Jones <tonyg@lshift.net>
parents:
121
diff
changeset
|
14 |
define s:foldl stream seed fn = |
aa741ba92190
Define reverse in terms of foldl
Tony Garnock-Jones <tonyg@lshift.net>
parents:
121
diff
changeset
|
15 |
<(stream, seed)> [ [|], seed = seed; |
aa741ba92190
Define reverse in terms of foldl
Tony Garnock-Jones <tonyg@lshift.net>
parents:
121
diff
changeset
|
16 |
[f|r], seed -> self(r, fn(f, seed)) ]; |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
17 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
18 |
define s:foldr stream seed fn = |
121 | 19 |
<stream> [ [|] = seed; |
114
9db0e647a063
Remove rec and lazy from the language
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
104
diff
changeset
|
20 |
[f|r] -> fn(f, self(r)) ]; |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
21 |
|
125
aa741ba92190
Define reverse in terms of foldl
Tony Garnock-Jones <tonyg@lshift.net>
parents:
121
diff
changeset
|
22 |
define s:reverse stream = s:foldl stream [|] s:cons; |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
23 |
define s:append(s1, s2) = s:foldr s1 s2 s:cons; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
24 |
|
126 | 25 |
define s:foldlK stream seed fn k = |
26 |
<(stream, seed)> [ [|], seed = k seed; |
|
27 |
[f|r], seed -> fn (f, seed) {v -> self(r, v)} ]; |
|
28 |
||
29 |
define s:foldrK stream seed fn k = |
|
30 |
<(stream, k)> [ [|], k = k seed; |
|
31 |
[f|r], k = self(r, {v -> fn (f, v) k}) ]; |
|
32 |
||
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
33 |
define n:range = { |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
34 |
(low, high, step) -> (low < high) { |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
35 |
.:true -> [low | n:range(low + step, high, step)]; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
36 |
.:false -> [|] |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
37 |
}; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
38 |
(low, high) -> n:range(low, high, 1); |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
39 |
(high) -> n:range(0, high, 1) |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
40 |
}; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
41 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
42 |
define s:concatenate stream = s:foldr stream [|] s:append; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
43 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
44 |
define s:map stream fn = s:foldr stream [|] {elt, acc -> [fn(elt) | acc]}; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
45 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
46 |
define s:foreach stream fn = |
114
9db0e647a063
Remove rec and lazy from the language
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
104
diff
changeset
|
47 |
<stream> [ [|] -> .:ok; |
9db0e647a063
Remove rec and lazy from the language
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
104
diff
changeset
|
48 |
[f|r] -> do fn(f); self(r) ]; |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
49 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
50 |
define string:stream = { |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
51 |
(str, startIndex) -> |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
52 |
let len = string:length(str); |
114
9db0e647a063
Remove rec and lazy from the language
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
104
diff
changeset
|
53 |
<startIndex> [ index -> |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
54 |
(index < len) { |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
55 |
.:true -> {.bytes = str; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
56 |
.offset = index; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
57 |
visitor -> visitor.s:next(string:charAt(str, index), |
114
9db0e647a063
Remove rec and lazy from the language
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
104
diff
changeset
|
58 |
self(index + 1))}; |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
59 |
.:false -> s:nil |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
60 |
} |
114
9db0e647a063
Remove rec and lazy from the language
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
104
diff
changeset
|
61 |
]; |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
62 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
63 |
(str) -> string:stream(str, 0) |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
64 |
}; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
65 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
66 |
define repl:newOn(port) = |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
67 |
let socket = socket:ServerSocket.new(port); |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
68 |
:spawn { repl:acceptLoop(socket) }; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
69 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
70 |
define repl:acceptLoop(serverSocket) = |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
71 |
:repeat { |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
72 |
let sock = serverSocket.accept(); |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
73 |
:spawn { repl:mainLoop(sock) } |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
74 |
}; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
75 |
|
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
76 |
define repl:mainLoop(sock) = |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
77 |
catch { sessionReturn -> |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
78 |
let writer = sock.writer(); |
150
85a2a4f498cd
Switch to alternaparse
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
126
diff
changeset
|
79 |
do writer.println("Welcome to ThiNG!"); |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
80 |
:repeat { |
150
85a2a4f498cd
Switch to alternaparse
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
126
diff
changeset
|
81 |
do writer.print("ThiNG> "); |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
82 |
do sock.compileOneStatement() { |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
83 |
.ok(thunk) -> writer.println(thunk()); |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
84 |
.error(detail) -> |
150
85a2a4f498cd
Switch to alternaparse
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
126
diff
changeset
|
85 |
do s:foreach ["PARSE ERROR", detail] (writer.println); |
104
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
86 |
do sock.close(); |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
87 |
sessionReturn(); |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
88 |
}; |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
89 |
writer.println(); |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
90 |
} |
8856b63d0561
More development of etng-r1
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
91 |
}; |