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 }
63 0 0 s
" ' not found" sym pr
-str s
" '" ...throw
-str
67 : eval
-ast
{ env list
-- list
}
69 list
MalList/start
@ { expr
-start
}
70 list
MalList/count
@ 0 ?do
71 env expr
-start
i cells
+ @ eval
,
76 extend mal
-eval
{ env list
-- val }
77 list
MalList/count
@ 0= if
80 env list
MalList/start
@ @ eval
81 env list
rot eval
-invoke
86 extend mal
-eval
( env vector
-- vector
)
87 MalVector/list
@ eval
-ast
88 MalVector new swap over
MalVector/list
! ;;
92 extend mal
-eval
( env map
-- map
)
93 MalMap/list
@ eval
-ast
94 MalMap new swap over
MalMap/list
! ;;
97 : rep
( str
-addr str
-len
-- str
-addr str
-len
)
102 create
buff 128 allot
103 77777777777 constant
stack-leak
-detect
109 buff 128 stdin read
-line
throw
110 while ( num
-bytes
-read
)
112 buff swap
( str
-addr str
-len
)
114 \ execute ['] nop \ uncomment
to see
stack traces
117 stack-leak
-detect
<> if ." --stack leak--" cr endif
119 begin stack-leak
-detect
= until
121 s
" forth-errno" MalKeyword. errno
MalInt. MalMap/Empty assoc
124 ." Uncaught exception: "
125 exception-object
pr-str
safe-type cr