4 : args
-as-native
{ argv argc
-- entry
*argc
... }
6 argv i cells
+ @ as-native
9 : env
-assoc
( map sym
-str
-addr sym
-str
-len xt
)
10 -rot
MalSymbol. swap
MalNativeFn. rot
assoc ;
13 s
" +" :noname
args-as-native
+ MalInt. ; env
-assoc
14 s
" -" :noname
args-as-native
- MalInt. ; env
-assoc
15 s
" *" :noname
args-as-native
* MalInt. ; env
-assoc
16 s
" /" :noname
args-as-native
/ MalInt. ; env
-assoc
20 : eval
( env obj
) mal
-eval
;
22 \
." Type: " dup mal
-type @ type-name
safe-type cr
25 MalDefault extend mal
-eval
nip ;; drop \
By default, evalutate
to yourself
28 extend eval
-invoke
{ env list
kw -- val }
29 0 kw env list
MalList/start
@ cell
+ @ eval
get
31 \ compute
not-found value
32 list
MalList/count
@ 1 > if
33 env list
MalList/start
@ 2 cells
+ @ eval
40 \ eval
all but
the first
item of list
41 : eval
-rest
{ env list
-- argv argc
}
42 list
MalList/start
@ cell
+ { expr
-start
}
43 list
MalList/count
@ 1- { argc
}
44 argc cells
allocate throw
{ target
}
46 env expr
-start
i cells
+ @ eval
52 extend eval
-invoke
( env list
this -- list
)
53 MalNativeFn/xt
@ { xt
}
54 eval
-rest
( argv
argc )
55 xt
execute ( return
-val ) ;;
59 extend mal
-eval
{ env sym
-- val }
70 : eval
-ast
{ env list
-- list
}
72 list
MalList/start
@ { expr
-start
}
73 list
MalList/count
@ 0 ?do
74 env expr
-start
i cells
+ @ eval
,
79 extend mal
-eval
{ env list
-- val }
80 env list
MalList/start
@ @ eval
81 env list
rot eval
-invoke
;;
85 extend mal
-eval
( env vector
-- vector
)
86 MalVector/list
@ eval
-ast
87 MalVector new swap over
MalVector/list
! ;;
91 extend mal
-eval
( env map
-- map
)
92 MalMap/list
@ eval
-ast
93 MalMap new swap over
MalMap/list
! ;;
96 : rep
( str
-addr str
-len
-- str
-addr str
-len
)
101 create
buff 128 allot
102 77777777777 constant
stack-leak
-detect
108 buff 128 stdin read
-line
throw
109 while ( num
-bytes
-read
)
110 buff swap
( str
-addr str
-len
)
113 catch ?dup 0= if safe-type else ." Caught error " . endif
115 stack-leak-detect <> if ." --stack leak--" cr endif