diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2014-07-31 02:27:41 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2014-07-31 02:27:41 -0700 |
commit | b20165a89034e3ff6bf3959529c4dec4bab11f40 (patch) | |
tree | dfab8fa8cec8a02bc31146a467dca39e2683d74e | |
parent | 52c3822e0870942112a7d180d81d2caedd6aea4e (diff) | |
download | mu-b20165a89034e3ff6bf3959529c4dec4bab11f40.tar.gz |
44 - now 'deref' is a bit of metadata on any operand rather than a special op
Still only works in read, and only in a single instruction. But these are details.
-rw-r--r-- | mu.arc | 13 | ||||
-rw-r--r-- | mu.arc.t | 4 | ||||
-rw-r--r-- | new.mu | 2 |
3 files changed, 12 insertions, 7 deletions
diff --git a/mu.arc b/mu.arc index c44e1269..ae59da7c 100644 --- a/mu.arc +++ b/mu.arc @@ -20,12 +20,20 @@ (mac v (operand) ; for value `(,operand 0)) +(mac metadata (operand) + `(cdr ,operand)) + (mac ty (operand) `(,operand 1)) ; assume type is always first bit of metadata, and it's always present (mac m (loc) ; for memory `(memory* (v ,loc))) +(mac m2 (loc) ; for memory + `(if (pos 'deref (metadata ,loc)) + (memory* (memory* (v ,loc))) + (memory* (v ,loc)))) + (def run (instrs (o fn-args) (o fn-oargs)) (ret result nil (let fn-arg-idx 0 @@ -109,10 +117,7 @@ ;? (prn "jumping to " pc) (continue)) copy - (= (m oarg.0) (m arg.0)) - deref - (= (m oarg.0) - (memory* (m arg.0))) + (= (m oarg.0) (m2 arg.0)) reply (do (= result arg) (break)) diff --git a/mu.arc.t b/mu.arc.t index 4d2efd3c..9883e874 100644 --- a/mu.arc.t +++ b/mu.arc.t @@ -310,11 +310,11 @@ '((main ((1 integer-address) <- literal 2) ((2 integer) <- literal 34) - ((3 integer) <- deref (1 integer-address))))) + ((3 integer) <- copy (1 integer-address deref))))) (run function*!main) ;? (prn memory*) (if (~iso memory* (obj 1 2 2 34 3 34)) - (prn "F - 'deref' performs indirect addressing")) + (prn "F - 'copy' performs indirect addressing")) (clear) (add-fns diff --git a/new.mu b/new.mu index aa0f28c4..04cfbbed 100644 --- a/new.mu +++ b/new.mu @@ -2,7 +2,7 @@ (main ((1 integer) <- literal 1000) ; location 1 contains the high-water mark for the memory allocator ((4 integer-address) <- new) - ((5 integer) <- deref (4 integer-address)) + ((5 integer) <- copy (4 integer-address deref)) ) (new |