diff --git a/doc/abi.org b/doc/abi.org index 439ecb5..d6b6db2 100644 --- a/doc/abi.org +++ b/doc/abi.org @@ -132,3 +132,85 @@ evaluation of ~(fac 0)~: (push! 1) ; [] [] (call! ktail) ; [1] [] #+end_src + +#+begin_src scheme +(push! 3) ; [] [] +(push-cont! halt) ; [3] [] +(call! fac) ; [3] [halt] + +(define n (pop!)) ; [3] [halt] +(push! n) ; [] [halt] +(push-cont! fac-k0) ; [3] [halt] +(push! n) ; [3] [halt fac-k0] +(call! zero?) ; [3 3] [halt fac-k0] +# ; [3 3] [halt fac-k0] +(define x0 (pop!)) ; [3 #f] [halt] +(define n (pop!)) ; [3] [halt] +(define x1 (- n 1)) ; [] [halt] +(push! n) ; [] [halt] +(push! x1) ; [3] [halt] +(push-cont! fac-k1) ; [3 2] [halt] +(call! fac) ; [3 2] [halt fac-k1] + +(define n (pop!)) ; [3 2] [halt fac-k1] +(push! n) ; [3 ] [halt fac-k1] +(push-cont! fac-k0) ; [3 2] [halt fac-k1] +(push! n) ; [3 2] [halt fac-k1 fac-k0] +(call! zero?) ; [3 2 2] [halt fac-k1 fac-k0] +# ; [3 2 2] [halt fac-k1 fac-k0] +(define x0 (pop!)) ; [3 2 #f] [halt fac-k1] +(define n (pop!)) ; [3 2] [halt fac-k1] +(define x1 (- n 1)) ; [3] [halt fac-k1] +(push! n) ; [3] [halt fac-k1] +(push! x1) ; [3 2] [halt fac-k1] +(push-cont! fac-k1) ; [3 2 1] [halt fac-k1] +(call! fac) ; [3 2 1] [halt fac-k1 fac-k1] + +(define n (pop!)) ; [3 2 1] [halt fac-k1 fac-k1] +(push! n) ; [3 2] [halt fac-k1 fac-k1] +(push-cont! fac-k0) ; [3 2 1] [halt fac-k1 fac-k1] +(push! n) ; [3 2 1] [halt fac-k1 fac-k1 fac-k0] +(call! zero?) ; [3 2 1 1] [halt fac-k1 fac-k1 fac-k0] +# ; [3 2 1 1] [halt fac-k1 fac-k1 fac-k0] +(define x0 (pop!)) ; [3 2 1 #f] [halt fac-k1 fac-k1] +(define n (pop!)) ; [3 2 1] [halt fac-k1 fac-k1] +(define x1 (- n 1)) ; [3 2] [halt fac-k1 fac-k1] +(push! n) ; [3 2] [halt fac-k1] +(push! x1) ; [3 2 1] [halt fac-k1 fac-k1] +(push-cont! fac-k1) ; [3 2 1 0] [halt fac-k1 fac-k1] +(call! fac) ; [3 2 1 0] [halt fac-k1 fac-k1 fac-k1] + +(define n (pop!)) ; [3 2 1 0] [halt fac-k1 fac-k1 fac-k1] +(push! n) ; [3 2 1] [halt fac-k1 fac-k1 fac-k1] +(push-cont! fac-k0) ; [3 2 1 0] [halt fac-k1 fac-k1 fac-k1] +(push! n) ; [3 2 1 0] [halt fac-k1 fac-k1 fac-k1 fac-k0] +(call! zero?) ; [3 2 1 0 0] [halt fac-k1 fac-k1 fac-k1 fac-k0] +# ; [3 2 1 0 0] [halt fac-k1 fac-k1 fac-k1 fac-k0] +(define x0 (pop!)) ; [3 2 1 0 #t] [halt fac-k1 fac-k1 fac-k1] +(define n (pop!)) ; [3 2 1 0] [halt fac-k1 fac-k1 fac-k1] +(define ktail (pop-cont!)) ; [3 2 1] [halt fac-k1 fac-k1 fac-k1] +(push! 1) ; [3 2 1 1] [halt fac-k1 fac-k1] +(call! ktail) ; [3 2 1 1] [halt fac-k1 fac-k1] + +(define n (pop!)) ; [3 2 1 1] [halt fac-k1 fac-k1] +(define x2 (pop!)) ; [3 2 1] [halt fac-k1 fac-k1] +(define x3 (* n x2)) ; [3 2] [halt fac-k1 fac-k1] +(define ktail (pop-cont!)) ; [3 2] [halt fac-k1 fac-k1] +(push! x3) ; [3 2] [halt fac-k1] +(call! ktail) ; [3 2 1] [halt fac-k1] + +(define n (pop!)) ; [3 2 1] [halt fac-k1] +(define x2 (pop!)) ; [3 2] [halt fac-k1] +(define x3 (* n x2)) ; [3] [halt fac-k1] +(define ktail (pop-cont!)) ; [3] [halt fac-k1] +(push! x3) ; [3] [halt] +(call! ktail) ; [3 2] [halt] + +(define n (pop!)) ; [3 2] [halt] +(define x2 (pop!)) ; [3] [halt] +(define x3 (* n x2)) ; [] [halt] +(define ktail (pop-cont!)) ; [] [halt] +(push! x3) ; [] [] +(call! ktail) ; [6] [] +;; => (halt 6) +#+end_src diff --git a/src/Gyehoek/Stack/Syntax.hs b/src/Gyehoek/Stack/Syntax.hs index 0423aaa..c74207a 100644 --- a/src/Gyehoek/Stack/Syntax.hs +++ b/src/Gyehoek/Stack/Syntax.hs @@ -25,7 +25,8 @@ import Effectful newtype Program = MkProgram - { blocks :: HashMap Name Block } + { blocks :: HashMap Name Block + } deriving stock (Show, Generic, Data) newtype Block = MkBlock { code :: List Instr }