3 - early return

This commit is contained in:
Kartik K. Agaram 2014-07-06 01:57:47 -07:00
parent a1fe0ff3c7
commit 8fafaf8982
2 changed files with 31 additions and 13 deletions

29
mu.arc
View File

@ -8,20 +8,23 @@
(each (name . body) fns
(= function*.name body)))
(def run (instrs)
(def run (instrs (o returned))
(each instr instrs
;? (prn instr)
(let (oarg1 <- op arg1 arg2) instr
;? (prn op)
(case op
loadi
(= memory*.oarg1 arg1)
add
(= memory*.oarg1
(+ memory*.arg1 memory*.arg2))
; else user-defined function
(run function*.op)
)))
(unless returned
;? (prn instr)
(let (oarg1 <- op arg1 arg2) instr
;? (prn op)
(case op
loadi
(= memory*.oarg1 arg1)
add
(= memory*.oarg1
(+ memory*.arg1 memory*.arg2))
return
(set returned)
; else user-defined function
(run function*.op)
))))
;? (prn "return")
)

View File

@ -21,3 +21,18 @@
;? (prn memory*)
(if (~iso memory* (obj 1 1 2 3 3 4))
(prn "F - compound functions work"))
(clear)
(add-fns
'((add-fn
(3 <- add 1 2)
(_ <- return)
(4 <- loadi 34))
(main
(1 <- loadi 1)
(2 <- loadi 3)
(_ <- add-fn))))
(run function*!main)
;? (prn memory*)
(if (~iso memory* (obj 1 1 2 3 3 4))
(prn "F - early return works"))