1 MalCore
:= Object clone do(
3 f
:= File with(a
at(0))
10 res
:= MalMap
withMap(a
at(0))
11 a rest
foreach(k
, res
removeKey(k
))
16 if(a
at(1) < a
at(0) size
,
18 Exception raise("nth: index out of range")
26 MalList
with(a rest reverse
appendSeq(coll
)),
28 MalVector
with(coll
appendSeq(a rest
))
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
))
40 obj
foreach(i
, c
, lst
append(obj
inclusiveSlice(i
, i
)))
41 return(MalList
with(lst
))
48 newVal
:= a
at(1) call(MalList
with(list(atom val
)) appendSeq(a
slice(2)))
49 atom
setVal(newVal
) val
53 "=", block(a
, a
at(0) == a
at(1)),
54 "throw", block(a
, MalException
with(a
at(0)) raise),
56 "nil?", block(a
, a
at(0) isNil),
57 "true?", block(a
, a
at(0) == true
),
58 "false?", block(a
, a
at(0) == false
),
59 "string?", block(a
, a
at(0) type == "Sequence"),
60 "symbol", block(a
, MalSymbol
with(a
at(0))),
61 "symbol?", block(a
, a
at(0) type == "MalSymbol"),
62 "keyword", block(a
, MalKeyword
with(a
at(0))),
63 "keyword?", block(a
, a
at(0) type == "MalKeyword"),
65 "pr-str", block(a
, a
map(s
, s
malPrint(true
)) join(" ")),
66 "str", block(a
, a
map(s
, s
malPrint(false
)) join("")),
67 "prn", block(a
, a
map(s
, s
malPrint(true
)) join(" ") println
; nil
),
68 "println", block(a
, a
map(s
, s
malPrint(false
)) join(" ") println
; nil
),
69 "read-string", block(a
, MalReader
read_str(a
at(0))),
70 "readline", block(a
, MalReadline
readLine(a
at(0))),
73 "<", block(a
, a
at(0) < a
at(1)),
74 "<=", block(a
, a
at(0) <= a
at(1)),
75 ">", block(a
, a
at(0) > a
at(1)),
76 ">=", block(a
, a
at(0) >= a
at(1)),
77 "+", block(a
, a
at(0) + a
at(1)),
78 "-", block(a
, a
at(0) - a
at(1)),
79 "*", block(a
, a
at(0) * a
at(1)),
80 "/", block(a
, a
at(0) / a
at(1)),
81 "time-ms", block(a
, (Date now asNumber
* 1000.0) round
),
84 "list?", block(a
, a
at(0) type == "MalList"),
85 "vector", block(a
, MalVector
with(a
)),
86 "vector?", block(a
, a
at(0) type == "MalVector"),
87 "hash-map", block(a
, MalMap
withList(a
)),
88 "map?", block(a
, a
at(0) type == "MalMap"),
89 "assoc", block(a
, MalMap
withMap(a
at(0) merge(MalMap
withList(a rest
)))),
91 "get", block(a
, a
at(0) ifNil(return nil
) get(a
at(1))),
92 "contains?", block(a
, a
at(0) ifNil(return nil
) contains(a
at(1))),
93 "keys", block(a
, a
at(0) malKeys
),
94 "vals", block(a
, a
at(0) malVals
),
96 "sequential?", block(a
, if(a
at(0) ?isSequential
, true
, false
)),
97 "cons", block(a
, MalList
with(list(a
at(0)) appendSeq(a
at(1)))),
98 "concat", block(a
, MalList
with(a
reduce(appendSeq
, list()))),
100 "first", block(a
, a
at(0) ifNil(return nil
) first
),
101 "rest", block(a
, a
at(0) ifNil(return MalList
with(list())) rest
),
102 "empty?", block(a
, a
at(0) ifNil(true
) isEmpty
),
103 "count", block(a
, a
at(0) ifNil(return(0)) size
),
104 "apply", block(a
, a
at(0) call(MalList
with(a
slice(1, -1) appendSeq(a last
)))),
105 "map", block(a
, MalList
with(a
at(1) map(e
, a
at(0) call(MalList
with(list(e
)))))),
110 "meta", block(a
, a
at(0) ?meta
),
111 "with-meta", block(a
, a
at(0) clone setMeta(a
at(1))),
112 "atom", block(a
, MalAtom
with(a
at(0))),
113 "atom?", block(a
, a
at(0) type == "MalAtom"),
114 "deref", block(a
, a
at(0) val
),
115 "reset!", block(a
, a
at(0) setVal(a
at(1)) ; a
at(1)),