X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fscheme.4th;h=36a8106236fb9e4910a51d4cc0d11ea09de439d7;hb=effe46c25202697eecbecb427828f466a710c8bc;hp=a360b475064434854449066e13fd6ac9b31e4922;hpb=d2810af4877d1f166459c6778a00c4bc22292d1f;p=scheme.forth.jl.git diff --git a/src/scheme.4th b/src/scheme.4th index a360b47..36a8106 100644 --- a/src/scheme.4th +++ b/src/scheme.4th @@ -548,7 +548,7 @@ global-env obj! 2swap cons 2 +loop - depth 2- fixnum-type 2swap cons + depth 2- 2/ fixnum-type 2swap cons ; : make-continuation @@ -564,6 +564,10 @@ global-env obj! : continuation->rstack-list drop pair-type cdr ; +: stack-list-len ( stack-list -- n ) + car drop +; + : restore-param-stack ( continuation -- obj_stack ) continuation->pstack-list 2dup >R >R @@ -571,54 +575,58 @@ global-env obj! ( Allocate stack space first using psp!, then copy objects from list. ) - car drop + car drop 2* object-stack-base @ psp0 + + psp! R> R> 2dup cdr 2swap - car drop 2- 0 swap do + stack-list-len 1- 0 swap do 2dup car - PSP0 object-stack-base @ + i + 2 + ! - PSP0 object-stack-base @ + i + 1 + ! + PSP0 object-stack-base @ + i 2* + 2 + ! + PSP0 object-stack-base @ + i 2* + 1 + ! cdr - -2 +loop + -1 +loop 2drop ; : restore-return-stack ( continuation -- ) - R> \ store top of return stack on PS + continuation->rstack-list - 2dup >R >R - ( Allocate stack space first using rsp!, - then copy objects from list. ) + 2dup cdr 2swap stack-list-len ( list n ) - car drop - rsp0 + rsp! + dup RSP0 + RSP! \ expand return stack to accommodate entries - R> R> 2dup cdr - 2swap - car drop 0 swap do - 2dup car drop - rsp0 i + 1 + ! - cdr - 1- +loop + ( list n ) + + 1- \ initial offset n-1 + 0 \ final offset 0 + swap + do + 2dup cdr 2swap car drop + RSP0 i 1+ + ! + -1 +loop 2drop - trace - >R \ restore original top of return stack ; -: restore-continuation ( continuation -- ) - \ TODO: replace current parameter and return stacks with - \ contents of continuation object. +: restore-continuation-with-arg ( continuation obj -- ) + + >R >R \ Store obj on return stack + + 2dup >R >R \ Store copy of continuation on return stack - 2dup >R >R restore-param-stack - R> R> + + R> R> \ Pop continuation from return stack + + R> R> \ Pop obj from return stack + + 2swap + restore-return-stack ; @@ -1765,7 +1773,22 @@ parse-idx-stack parse-idx-sp ! endof continuation-type of - \ TODO: Apply continuation + 2swap + nil? if + except-message: ." Continuations expect exactly 1 argument." + recoverable-exception throw + then + + 2dup cdr + + nil? not if + except-message: ." Continuations expect exactly 1 argument." + recoverable-exception throw + then + + 2drop car + + restore-continuation-with-arg endof except-message: ." object '" drop print ." ' not applicable." recoverable-exception throw @@ -2152,8 +2175,6 @@ parse-idx-stack parse-idx-sp ! \ }}} -xxxx - \ ---- Loading files ---- {{{ : load ( addr n -- finalResult )