diff options
| author | Chouser <chouser@n01se.net> | 2015-02-19 19:42:52 -0500 |
|---|---|---|
| committer | Chouser <chouser@n01se.net> | 2015-02-21 13:22:44 -0500 |
| commit | 45c1894b9690b1156ffdc2caeb726bbc9526597a (patch) | |
| tree | 4e75609151fc88e78a2ccf93b0f6d2ac880f92c1 /forth/step6_file.fs | |
| parent | 6512bd80002eb106a304b035e9592847d90ef23c (diff) | |
| download | mal-45c1894b9690b1156ffdc2caeb726bbc9526597a.tar.gz mal-45c1894b9690b1156ffdc2caeb726bbc9526597a.zip | |
forth: Back-propogate fixes from stepA through step1
Diffstat (limited to 'forth/step6_file.fs')
| -rw-r--r-- | forth/step6_file.fs | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/forth/step6_file.fs b/forth/step6_file.fs index d675f6e..b3945ad 100644 --- a/forth/step6_file.fs +++ b/forth/step6_file.fs @@ -4,12 +4,6 @@ require core.fs core MalEnv. constant repl-env -\ Fully evalutate any Mal object: -def-protocol-method mal-eval ( env ast -- val ) - -\ Invoke an object, given whole env and unevaluated argument forms: -def-protocol-method invoke ( argv argc mal-fn -- ... ) - 99999999 constant TCO-eval : read read-str ; @@ -28,7 +22,7 @@ def-protocol-method invoke ( argv argc mal-fn -- ... ) MalDefault extend mal-eval nip ;; drop \ By default, evalutate to yourself MalKeyword - extend invoke { env list kw -- val } + extend eval-invoke { env list kw -- val } 0 kw env list MalList/start @ cell+ @ eval get ?dup 0= if \ compute not-found value @@ -52,14 +46,14 @@ drop target argc ; MalNativeFn - extend invoke ( env list this -- list ) + extend eval-invoke ( env list this -- list ) MalNativeFn/xt @ { xt } eval-rest ( argv argc ) xt execute ( return-val ) ;; drop SpecialOp - extend invoke ( env list this -- list ) + extend eval-invoke ( env list this -- list ) SpecialOp/xt @ execute ;; drop @@ -79,8 +73,7 @@ defspecial def! { env list -- val } list MalList/start @ cell+ { arg0 } arg0 @ ( key ) env arg0 cell+ @ eval dup { val } ( key val ) - env env/set - val ;; + env env/set val ;; defspecial let* { old-env list -- val } old-env MalEnv. { env } @@ -130,7 +123,7 @@ defspecial if { env list -- val } s" &" MalSymbol. constant &-sym MalUserFn - extend invoke { call-env list mal-fn -- list } + extend eval-invoke { call-env list mal-fn -- list } call-env list eval-rest { argv argc } mal-fn MalUserFn/formal-args @ { f-args-list } @@ -190,7 +183,7 @@ drop MalList extend mal-eval { env list -- val } env list MalList/start @ @ eval - env list rot invoke ;; + env list rot eval-invoke ;; drop MalVector @@ -208,7 +201,7 @@ drop defcore eval ( argv argc ) drop @ repl-env swap eval ;; -: rep ( str-addr str-len -- val ) +: rep ( str-addr str-len -- str-addr str-len ) read repl-env swap eval print ; @@ -221,21 +214,21 @@ defcore eval ( argv argc ) repeat 2drop here>MalList ; -s\" (def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))" rep drop - create buff 128 allot 77777777777 constant stack-leak-detect +s\" (def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))" rep 2drop + : repl ( -- ) begin ." user> " stack-leak-detect buff 128 stdin read-line throw - while - buff swap + while ( num-bytes-read ) + buff swap ( str-addr str-len ) ['] rep - execute type - \ catch ?dup 0= if safe-type else ." Caught error " . endif + \ execute type + catch ?dup 0= if safe-type else ." Caught error " . endif cr stack-leak-detect <> if ." --stack leak--" cr endif repeat ; |
