aboutsummaryrefslogtreecommitdiff
path: root/forth/step6_file.fs
diff options
context:
space:
mode:
authorChouser <chouser@n01se.net>2015-02-19 19:42:52 -0500
committerChouser <chouser@n01se.net>2015-02-21 13:22:44 -0500
commit45c1894b9690b1156ffdc2caeb726bbc9526597a (patch)
tree4e75609151fc88e78a2ccf93b0f6d2ac880f92c1 /forth/step6_file.fs
parent6512bd80002eb106a304b035e9592847d90ef23c (diff)
downloadmal-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.fs33
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 ;