aboutsummaryrefslogtreecommitdiff
path: root/forth/step3_env.fs
diff options
context:
space:
mode:
authorChouser <chouser@n01se.net>2015-02-14 16:08:17 -0500
committerChouser <chouser@n01se.net>2015-02-21 13:22:44 -0500
commit79feb89f9c75d30e79b9ef13fa40d2f8e22f4b9b (patch)
treee133202bdc8f99e0ea61b31d7241940f5a3e9f6c /forth/step3_env.fs
parente6106d4543fd4917a18ca501ee62a995a152d263 (diff)
downloadmal-79feb89f9c75d30e79b9ef13fa40d2f8e22f4b9b.tar.gz
mal-79feb89f9c75d30e79b9ef13fa40d2f8e22f4b9b.zip
forth: Add defspecial for Mal special ops
Diffstat (limited to 'forth/step3_env.fs')
-rw-r--r--forth/step3_env.fs23
1 files changed, 15 insertions, 8 deletions
diff --git a/forth/step3_env.fs b/forth/step3_env.fs
index f609858..c15f52b 100644
--- a/forth/step3_env.fs
+++ b/forth/step3_env.fs
@@ -54,19 +54,26 @@ SpecialOp
SpecialOp/xt @ execute ;;
drop
-s" quote" MalSymbol. :noname ( env list -- form )
- nip MalList/start @ cell+ @
-; SpecialOp. repl-env env/set
+: install-special ( symbol xt )
+ SpecialOp. repl-env env/set ;
-s" def!" MalSymbol. :noname { env list -- }
+: defspecial
+ parse-allot-name MalSymbol.
+ ['] install-special
+ :noname
+ ;
+
+defspecial quote ( env list -- form )
+ nip MalList/start @ cell+ @ ;;
+
+defspecial def! { env list -- }
list MalList/start @ cell+ { arg0 }
arg0 @ ( key )
env arg0 cell+ @ mal-eval dup { val } ( key val )
env env/set
- val
-; SpecialOp. repl-env env/set
+ val ;;
-s" let*" MalSymbol. :noname { old-env list -- }
+defspecial let* { old-env list -- }
old-env MalEnv. { env }
list MalList/start @ cell+ dup { arg0 }
@ to-list
@@ -78,7 +85,7 @@ s" let*" MalSymbol. :noname { old-env list -- }
2 +loop
env arg0 cell+ @ mal-eval
\ TODO: dec refcount of env
-; SpecialOp. repl-env env/set
+ ;;
MalSymbol
extend mal-eval { env sym -- val }