diff options
Diffstat (limited to 'mu.arc')
-rw-r--r-- | mu.arc | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/mu.arc b/mu.arc index b06d402f..ca4b0216 100644 --- a/mu.arc +++ b/mu.arc @@ -267,6 +267,8 @@ (mac results (routine) ; assignable `((((rep ,routine) 'call-stack) 0) 'results)) +(mac reply-args(routine) ; assignable + `((((rep ,routine) 'call-stack) 0) 'reply-args)) (def waiting-for-exact-cycle? (routine) (is 'until rep.routine!sleep.0)) @@ -794,13 +796,18 @@ reply (do (when arg (prepare-reply arg)) - (let results results.routine* + (with (results results.routine* + reply-args reply-args.routine*) (pop-stack routine*) (if empty.routine* (return ninstrs)) (let (caller-oargs _ _) (parse-instr (body.routine* pc.routine*)) (trace "reply" repr.arg " " repr.caller-oargs) - (each (dest val) (zip caller-oargs results) + (each (dest reply-arg val) (zip caller-oargs reply-args results) +;? (prn dest " / " reply-arg " => " val) ;? 1 (when nondummy.dest + (when (pos '(nochange) metadata.reply-arg) + (unless (is dest (m reply-arg)) + (die "'nochange' arg in @repr.reply-args can't bind to @repr.caller-oargs"))) (trace "reply" repr.val " => " dest) (setm dest val)))) (++ pc.routine*) @@ -845,7 +852,8 @@ (= results.routine* (accum yield (each a args - (yield (m a)))))) + (yield (m a))))) + (= reply-args.routine* args)) ; helpers for memory access respecting ; immediate addressing - 'literal' and 'offset' @@ -2038,15 +2046,15 @@ (stdin:channel-address <- next-input) ;? (c:character <- copy ((#\a literal))) ;? 1 ;? (curr:tagged-value <- save-type c:character) ;? 1 -;? (stdin:channel-address/deref <- write stdin:channel-address curr:tagged-value) ;? 1 +;? (stdin:channel-address/deref/nochange <- write stdin:channel-address curr:tagged-value) ;? 1 ;? (c:character <- copy ((#\newline literal))) ;? 1 ;? (curr:tagged-value <- save-type c:character) ;? 1 -;? (stdin:channel-address/deref <- write stdin:channel-address curr:tagged-value) ;? 1 +;? (stdin:channel-address/deref/nochange <- write stdin:channel-address curr:tagged-value) ;? 1 { begin ;? 1 (c:character <- read-key k:keyboard-address) ;? 1 (loop-unless c:character) ;? 1 (curr:tagged-value <- save-type c:character) ;? 1 - (stdin:channel-address/deref <- write stdin:channel-address curr:tagged-value) ;? 1 + (stdin:channel-address/deref/nochange <- write stdin:channel-address curr:tagged-value) ;? 1 (eof?:boolean <- equal c:character ((#\null literal))) ;? 1 (break-if eof?:boolean) ;? 1 (loop) ;? 1 @@ -2063,7 +2071,7 @@ ;? ($dump-channel 1093:literal) ;? 1 ; read characters from stdin until newline, copy into line { begin - (x:tagged-value stdin:channel-address/deref <- read stdin:channel-address) + (x:tagged-value stdin:channel-address/deref/nochange <- read stdin:channel-address) (c:character <- maybe-coerce x:tagged-value character:literal) (assert c:character) ;? (print-primitive-to-host line:buffer-address) ;? 1 @@ -2095,7 +2103,7 @@ (curr:tagged-value <- save-type c:character) ;? ($dump-channel 1093:literal) ;? 1 ;? ($start-tracing) ;? 1 - (buffered-stdin:channel-address/deref <- write buffered-stdin:channel-address curr:tagged-value) + (buffered-stdin:channel-address/deref/nochange <- write buffered-stdin:channel-address curr:tagged-value) ;? ($stop-tracing) ;? 1 ;? ($dump-channel 1093:literal) ;? 1 ;? ($quit) ;? 1 @@ -2345,7 +2353,7 @@ (screen:terminal-address <- next-input) (stdout:channel-address <- next-input) { begin - (x:tagged-value stdout:channel-address/deref <- read stdout:channel-address) + (x:tagged-value stdout:channel-address/deref/nochange <- read stdout:channel-address) (c:character <- maybe-coerce x:tagged-value character:literal) (done?:boolean <- equal c:character ((#\null literal))) (break-if done?:boolean) |