diff options
-rw-r--r-- | mu.arc | 7 | ||||
-rw-r--r-- | mu.arc.t | 60 |
2 files changed, 36 insertions, 31 deletions
diff --git a/mu.arc b/mu.arc index 8bb498de..3499bb49 100644 --- a/mu.arc +++ b/mu.arc @@ -1,5 +1,10 @@ ; things that a future assembler will need separate memory for: ; code; types; args channel +(= initialization-fns* (queue)) +(def reset () + (each f (as cons initialization-fns*) + (f))) + (def clear () (= types* (obj type (obj size 1 record nil array nil address nil) @@ -11,7 +16,7 @@ )) (= memory* (table)) (= function* (table))) -(clear) +(enq clear initialization-fns*) (def add-fns (fns) (each (name . body) fns diff --git a/mu.arc.t b/mu.arc.t index 91b3faaa..bbcf8072 100644 --- a/mu.arc.t +++ b/mu.arc.t @@ -1,13 +1,13 @@ (load "mu.arc") -(clear) +(reset) (add-fns '((test1 ((1 integer) <- literal 1)))) (run function*!test1) (if (~iso memory* (obj 1 1)) (prn "F - 'literal' writes a literal value (its lone 'arg' after the instruction name) to a location in memory (an address) specified by its lone 'oarg' or output arg before the arrow")) -(clear) +(reset) (add-fns '((test1 ((1 integer) <- literal 1) ((2 integer) <- literal 3) @@ -16,7 +16,7 @@ (if (~iso memory* (obj 1 1 2 3 3 4)) (prn "F - 'add' operates on two addresses")) -(clear) +(reset) (add-fns '((test1 ((3 integer) <- add (1 integer) (2 integer))) @@ -29,7 +29,7 @@ (if (~iso memory* (obj 1 1 2 3 3 4)) (prn "F - calling a user-defined function runs its instructions")) -(clear) +(reset) (add-fns '((test1 ((3 integer) <- add (1 integer) (2 integer)) @@ -45,7 +45,7 @@ (prn "F - 'reply' stops executing the current function")) ;? (quit) -(clear) +(reset) (add-fns '((test1 ((4 integer) <- arg) @@ -66,7 +66,7 @@ (prn "F - 'arg' accesses in order the operands of the most recent function call (the caller)")) ;? (quit) -(clear) +(reset) (add-fns '((test1 ((5 integer) <- arg 1) @@ -87,7 +87,7 @@ (prn "F - 'arg' with index can access function call arguments out of order")) ;? (quit) -(clear) +(reset) (add-fns '((test1 ((4 integer) <- arg) @@ -106,7 +106,7 @@ 4 1 5 3 6 4)) (prn "F - 'reply' can take aguments that are returned, or written back into output args of caller")) -(clear) +(reset) (add-fns '((test1 ((4 integer) <- arg) @@ -125,7 +125,7 @@ 4 1 5 3 6 4)) (prn "F - 'reply' permits a function to return multiple values at once")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 1) @@ -136,7 +136,7 @@ (if (~iso memory* (obj 1 1 2 3 3 -2)) (prn "F - 'sub' subtracts the value at one address from the value at another")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 2) @@ -147,7 +147,7 @@ (if (~iso memory* (obj 1 2 2 3 3 6)) (prn "F - 'mul' multiplies like 'add' adds")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 8) @@ -158,7 +158,7 @@ (if (~iso memory* (obj 1 8 2 3 3 (/ real.8 3))) (prn "F - 'div' divides like 'add' adds")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 8) @@ -169,7 +169,7 @@ (if (~iso memory* (obj 1 8 2 3 3 2 4 2)) (prn "F - 'idiv' performs integer division, returning quotient and remainder")) -(clear) +(reset) (add-fns '((main ((1 boolean) <- literal t) @@ -180,7 +180,7 @@ (if (~iso memory* (obj 1 t 2 nil 3 nil)) (prn "F - logical 'and' for booleans")) -(clear) +(reset) (add-fns '((main ((1 boolean) <- literal 4) @@ -191,7 +191,7 @@ (if (~iso memory* (obj 1 4 2 3 3 nil)) (prn "F - 'lt' is the less-than inequality operator")) -(clear) +(reset) (add-fns '((main ((1 boolean) <- literal 4) @@ -202,7 +202,7 @@ (if (~iso memory* (obj 1 4 2 3 3 nil)) (prn "F - 'le' is the <= inequality operator")) -(clear) +(reset) (add-fns '((main ((1 boolean) <- literal 4) @@ -213,7 +213,7 @@ (if (~iso memory* (obj 1 4 2 4 3 t)) (prn "F - 'le' returns true for equal operands")) -(clear) +(reset) (add-fns '((main ((1 boolean) <- literal 4) @@ -224,7 +224,7 @@ (if (~iso memory* (obj 1 4 2 5 3 t)) (prn "F - le is the <= inequality operator - 2")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 8) @@ -236,7 +236,7 @@ (if (~iso memory* (obj 1 8)) (prn "F - 'jmp' skips some instructions")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 8) @@ -249,7 +249,7 @@ (if (~iso memory* (obj 1 8)) (prn "F - 'jmp' doesn't skip too many instructions")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 1) @@ -264,7 +264,7 @@ (if (~iso memory* (obj 1 1 2 1 3 t)) (prn "F - 'jif' is a conditional 'jmp'")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 1) @@ -279,7 +279,7 @@ (if (~iso memory* (obj 1 1 2 2 3 nil 4 3)) (prn "F - if 'jif's first arg is false, it doesn't skip any instructions")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 2) @@ -295,7 +295,7 @@ (if (~iso memory* (obj 1 2 2 4 3 nil 4 3)) (prn "F - 'jif' can take a negative offset to make backward jumps")) -(clear) +(reset) (add-fns '((main ((1 integer) <- literal 34) @@ -305,7 +305,7 @@ (if (~iso memory* (obj 1 34 2 34)) (prn "F - 'copy' performs direct addressing")) -(clear) +(reset) (add-fns '((main ((1 integer-address) <- literal 2) @@ -316,7 +316,7 @@ (if (~iso memory* (obj 1 2 2 34 3 34)) (prn "F - 'copy' performs indirect addressing")) -(clear) +(reset) (add-fns '((main ((1 integer-address) <- literal 2) @@ -328,7 +328,7 @@ (if (~iso memory* (obj 1 2 2 36 3 2)) (prn "F - instructions can performs indirect addressing on output arg")) -(clear) +(reset) (add-fns '((test1 ((4 type) <- otype 0) @@ -350,7 +350,7 @@ 4 'integer 5 'integer 6 nil 7 1 8 3 9 4)) (prn "F - an example function that checks that its args are integers")) -(clear) +(reset) (add-fns '((add-fn ((4 type) <- otype 0) @@ -380,7 +380,7 @@ 4 'boolean 5 'boolean 6 nil 7 t 8 t 9 t)) (prn "F - an example function that can do different things (dispatch) based on the type of its args or oargs")) -(clear) +(reset) (add-fns '((add-fn ((4 type) <- otype 0) @@ -487,7 +487,7 @@ (reply))) (prn "F - convert-braces balances curlies when converting continue")) -(clear) +(reset) (add-fns `((main ,@(convert-braces '(((1 integer) <- literal 4) ((2 integer) <- literal 1) { begin @@ -504,7 +504,7 @@ (if (~iso memory* (obj 1 4 2 4 3 nil 4 34)) (prn "F - continue correctly loops")) -(clear) +(reset) (add-fns `((main ,@(convert-braces '(((1 integer) <- literal 4) ((2 integer) <- literal 2) { begin |