Merge pull request #383 from asarhaddon/ada2tco-do
[jackhill/mal.git] / io / MalCore.io
CommitLineData
e4f737c3
DM
1MalCore := Object clone do(
2 slurp := block(a,
3 f := File with(a at(0))
4 res := f contents
5 f close
6 res
7 )
bea8cb29 8
a7353735
DM
9 dissoc := block(a,
10 res := MalMap withMap(a at(0))
11 a rest foreach(k, res removeKey(k))
12 res
13 )
14
15f8f2d0
DM
15 nth := block(a,
16 if(a at(1) < a at(0) size,
17 a at(0) at(a at(1)),
18 Exception raise("nth: index out of range")
19 )
20 )
21
55acffa6
DM
22 conj := block(a,
23 coll := a at(0)
24 coll type switch(
25 "MalList",
26 MalList with(a rest reverse appendSeq(coll)),
27 "MalVector",
28 MalVector with(coll appendSeq(a rest))
29 )
30 )
31
32 seq := block(a,
33 obj := a at(0)
34 (obj isNil) ifTrue(return(nil))
35 (obj type == "MalList") ifTrue(return(if(obj isEmpty, nil, obj)))
36 (obj type == "MalVector") ifTrue(return(if(obj isEmpty, nil, MalList with(obj))))
37 (obj type == "Sequence") ifTrue(
38 if(obj isEmpty, return(nil))
39 lst := list()
40 obj foreach(i, c, lst append(obj inclusiveSlice(i, i)))
41 return(MalList with(lst))
42 )
43 nil
44 )
45
e4f737c3
DM
46 swapBang := block(a,
47 atom := a at(0)
a7353735
DM
48 newVal := a at(1) call(MalList with(list(atom val)) appendSeq(a slice(2)))
49 atom setVal(newVal) val
e4f737c3 50 )
bea8cb29 51
3ba35e66
DM
52 ioToMal := method(v,
53 (v isNil) ifTrue(return(v))
54 (v == true) ifTrue(return(v))
55 (v == false) ifTrue(return(v))
56 (v type == "Number") ifTrue(return(v))
57 (v type == "Sequence") ifTrue(return(v))
58 (v type == "List") ifTrue(return(MalList with(v map(e, ioToMal(e)))))
59 (v type == "Map") ifTrue(
60 lst := list()
61 v foreach(key, val,
62 lst push(key asString)
63 lst push(ioToMal(val))
64 )
65 return(MalMap withList(lst))
66 )
67 v asString
68 )
69
70 ioEval := block(a,
71 MalCore ioToMal(doString(a at(0)))
72 )
73
e4f737c3 74 NS := Map with(
a7353735
DM
75 "=", block(a, a at(0) == a at(1)),
76 "throw", block(a, MalException with(a at(0)) raise),
77
78 "nil?", block(a, a at(0) isNil),
79 "true?", block(a, a at(0) == true),
80 "false?", block(a, a at(0) == false),
55acffa6 81 "string?", block(a, a at(0) type == "Sequence"),
a7353735
DM
82 "symbol", block(a, MalSymbol with(a at(0))),
83 "symbol?", block(a, a at(0) type == "MalSymbol"),
84 "keyword", block(a, MalKeyword with(a at(0))),
85 "keyword?", block(a, a at(0) type == "MalKeyword"),
f1841741
DM
86 "number?", block(a, a at(0) type == "Number"),
87 "fn?", block(a, (a at(0) type == "Block") or
88 ((a at(0) type == "MalFunc") and (a at(0) isMacro not))),
89 "macro?", block(a, (a at(0) type == "MalFunc") and (a at(0) isMacro)),
bea8cb29 90
e4f737c3
DM
91 "pr-str", block(a, a map(s, s malPrint(true)) join(" ")),
92 "str", block(a, a map(s, s malPrint(false)) join("")),
93 "prn", block(a, a map(s, s malPrint(true)) join(" ") println ; nil),
94 "println", block(a, a map(s, s malPrint(false)) join(" ") println ; nil),
95 "read-string", block(a, MalReader read_str(a at(0))),
55acffa6 96 "readline", block(a, MalReadline readLine(a at(0))),
e4f737c3 97 "slurp", slurp,
bea8cb29 98
e4f737c3
DM
99 "<", block(a, a at(0) < a at(1)),
100 "<=", block(a, a at(0) <= a at(1)),
101 ">", block(a, a at(0) > a at(1)),
102 ">=", block(a, a at(0) >= a at(1)),
103 "+", block(a, a at(0) + a at(1)),
104 "-", block(a, a at(0) - a at(1)),
105 "*", block(a, a at(0) * a at(1)),
106 "/", block(a, a at(0) / a at(1)),
55acffa6 107 "time-ms", block(a, (Date now asNumber * 1000.0) round),
e4f737c3 108
a7353735
DM
109 "list", block(a, a),
110 "list?", block(a, a at(0) type == "MalList"),
111 "vector", block(a, MalVector with(a)),
112 "vector?", block(a, a at(0) type == "MalVector"),
113 "hash-map", block(a, MalMap withList(a)),
114 "map?", block(a, a at(0) type == "MalMap"),
115 "assoc", block(a, MalMap withMap(a at(0) merge(MalMap withList(a rest)))),
116 "dissoc", dissoc,
117 "get", block(a, a at(0) ifNil(return nil) get(a at(1))),
118 "contains?", block(a, a at(0) ifNil(return nil) contains(a at(1))),
119 "keys", block(a, a at(0) malKeys),
120 "vals", block(a, a at(0) malVals),
e4f737c3 121
a7353735 122 "sequential?", block(a, if(a at(0) ?isSequential, true, false)),
8f22ab1a
DM
123 "cons", block(a, MalList with(list(a at(0)) appendSeq(a at(1)))),
124 "concat", block(a, MalList with(a reduce(appendSeq, list()))),
15f8f2d0
DM
125 "nth", nth,
126 "first", block(a, a at(0) ifNil(return nil) first),
127 "rest", block(a, a at(0) ifNil(return MalList with(list())) rest),
e4f737c3
DM
128 "empty?", block(a, a at(0) ifNil(true) isEmpty),
129 "count", block(a, a at(0) ifNil(return(0)) size),
a7353735
DM
130 "apply", block(a, a at(0) call(MalList with(a slice(1, -1) appendSeq(a last)))),
131 "map", block(a, MalList with(a at(1) map(e, a at(0) call(MalList with(list(e)))))),
e4f737c3 132
55acffa6
DM
133 "conj", conj,
134 "seq", seq,
135
136 "meta", block(a, a at(0) ?meta),
137 "with-meta", block(a, a at(0) clone setMeta(a at(1))),
138 "atom", block(a, MalAtom with(a at(0))),
139 "atom?", block(a, a at(0) type == "MalAtom"),
140 "deref", block(a, a at(0) val),
141 "reset!", block(a, a at(0) setVal(a at(1)) ; a at(1)),
3ba35e66
DM
142 "swap!", swapBang,
143
144 "io-eval", ioEval
e4f737c3 145 )
bea8cb29 146)