From c05d35e8dd1ebbc371d7c9239d788ddf844eae31 Mon Sep 17 00:00:00 2001 From: Chouser Date: Sat, 14 Feb 2015 15:18:18 -0500 Subject: forth: Get rid of car/cdr style lists Rename MalArray to MalList --- forth/step3_env.fs | 57 +++++++++++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 35 deletions(-) (limited to 'forth/step3_env.fs') diff --git a/forth/step3_env.fs b/forth/step3_env.fs index 4b76c4d..269964d 100644 --- a/forth/step3_env.fs +++ b/forth/step3_env.fs @@ -32,13 +32,13 @@ MalFn extend invoke ( ... mal-fn -- ... ) MalFn/xt @ execute ;; - extend invoke+ { env ary this -- ary } + extend invoke+ { env list this -- list } \ Pass args on dictionary stack (!) - \ TODO: consider allocate and free of a real MalArray instead + \ TODO: consider allocate and free of a real MalList instead \ Normal list, evaluate and invoke here { val-start } - ary MalArray/start @ { expr-start } - ary MalArray/count @ 1 ?do + list MalList/start @ { expr-start } + list MalList/count @ 1 ?do env expr-start i cells + @ mal-eval , loop val-start here val-start - cell / this ( argv argc MalFn ) @@ -47,28 +47,28 @@ MalFn drop SpecialOp - extend invoke+ ( env ary this -- ary ) + extend invoke+ ( env list this -- list ) SpecialOp/xt @ execute ;; drop -s" quote" MalSymbol. :noname ( env ary -- form ) - nip MalArray/start @ cell+ @ +s" quote" MalSymbol. :noname ( env list -- form ) + nip MalList/start @ cell+ @ ; SpecialOp. repl-env env/set -s" def!" MalSymbol. :noname { env ary -- } - ary MalArray/start @ cell+ { arg0 } +s" def!" MalSymbol. :noname { 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 -s" let*" MalSymbol. :noname { old-env ary -- } +s" let*" MalSymbol. :noname { old-env list -- } old-env MalEnv. { env } - ary MalArray/start @ cell+ dup { arg0 } - @ to-array - dup MalArray/start @ { bindings-start } ( ary ) - MalArray/count @ 0 +do + list MalList/start @ cell+ dup { arg0 } + @ to-list + dup MalList/start @ { bindings-start } ( list ) + MalList/count @ 0 +do bindings-start i cells + dup @ swap cell+ @ ( sym expr ) env swap mal-eval env env/set @@ -89,31 +89,18 @@ MalSymbol endif ;; drop -MalArray - extend mal-eval { env ary -- val } - env ary MalArray/start @ @ mal-eval - env ary rot invoke+ ;; +MalList + extend mal-eval { env list -- val } + env list MalList/start @ @ mal-eval + env list rot invoke+ ;; - extend mal-eval-ast { env ary -- ary } + extend mal-eval-ast { env list -- list } here - ary MalArray/start @ { expr-start } - ary MalArray/count @ 0 ?do + list MalList/start @ { expr-start } + list MalList/count @ 0 ?do env expr-start i cells + @ mal-eval , loop - here>MalArray ;; -drop - -MalList - extend mal-eval-ast { env list -- ary } - here - list - begin ( list ) - dup mal-nil <> - while - env over MalList/car @ mal-eval , - MalList/cdr @ - repeat - drop here>MalArray ;; + here>MalList ;; drop MalVector -- cgit v1.2.3