X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fscheme.4th;h=4f04d8cab1302ef24d817918cf2c2dd7a31fb554;hb=7e659fc69e0155eb7fe4353debafb830da35097b;hp=bf3301d62632f4090bec85cac38325c9398a0d3d;hpb=bed7c8d700bc877790fb8a47774bb7fdcb655d03;p=scheme.forth.jl.git diff --git a/src/scheme.4th b/src/scheme.4th index bf3301d..4f04d8c 100644 --- a/src/scheme.4th +++ b/src/scheme.4th @@ -39,6 +39,7 @@ make-type pair-type make-type symbol-type make-type primitive-proc-type make-type compound-proc-type +make-type continuation-type make-type port-type : istype? ( obj type -- obj bool ) over = ; @@ -75,12 +76,6 @@ create car-type-cells scheme-memsize allot create cdr-cells scheme-memsize allot create cdr-type-cells scheme-memsize allot -variable gc-enabled -false gc-enabled ! - -: gc-enabled? - gc-enabled @ ; - create nextfrees scheme-memsize allot :noname scheme-memsize 0 do @@ -96,9 +91,7 @@ variable nextfree nextfree ! nextfree @ scheme-memsize >= if - gc-enabled? if - collect-garbage - then + collect-garbage then nextfree @ scheme-memsize >= if @@ -140,6 +133,10 @@ variable nextfree cdr-cells + ! ; +variable object-stack-base +: init-object-stack-base + depth object-stack-base ! ; + : nil 0 nil-type ; : nil? nil-type istype? ; @@ -458,7 +455,7 @@ variable read-line-buffer-offset nil? false = while 2over 2over first-frame - get-vars-vals-frame nil? false = if + get-vals-frame nil? false = if 2swap 2drop 2swap 2drop exit then @@ -475,7 +472,7 @@ objvar var \ Used only for error messages : lookup-var ( var env -- val ) 2over var obj! - get-vars-vals nil? if + get-vals nil? if except-message: ." tried to read unbound variable '" var obj@ print ." '." recoverable-exception throw then @@ -485,7 +482,8 @@ objvar var \ Used only for error messages : set-var ( var val env -- ) 2rot 2dup var obj! ( val env var ) - get-vars-vals nil? if + 2swap ( val var env ) + get-vals nil? if except-message: ." tried to set unbound variable '" var obj@ print ." '." recoverable-exception throw else @@ -497,15 +495,16 @@ hide var : define-var ( var val env -- ) first-frame ( var val frame ) - 2rot 2over 2over ( val frame var frame var ) + 2rot 2swap 2over 2over ( val var frame var frame ) get-vals-frame nil? if - 2drop ( val frame var ) - 2swap add-binding + 2drop + -2rot 2swap 2rot + add-binding else - ( val frame var vals ) + ( val var frame vals ) 2swap 2drop 2swap 2drop - cons + set-car! then ; @@ -521,6 +520,123 @@ global-env obj! \ }}} +\ ---- Continuations ---- {{{ + +: cons-return-stack ( -- listobj ) + rsp@ 1- rsp0 = if + nil exit + then + + nil rsp@ 1- rsp0 do + i 1+ @ fixnum-type 2swap cons + loop + + rsp@ 1- rsp0 - fixnum-type 2swap cons +; + +: cons-param-stack ( -- listobj ) + nil + + depth 2- object-stack-base @ = if + exit + then + + depth 2- object-stack-base @ do + PSP0 i + 1 + @ + PSP0 i + 2 + @ + + 2swap cons + 2 +loop + + depth 2- fixnum-type 2swap cons +; + +: make-continuation + + cons-param-stack + cons-return-stack + cons drop continuation-type +; + +: continuation->pstack-list + drop pair-type car ; + +: continuation->rstack-list + drop pair-type cdr ; + +: restore-param-stack ( continuation -- obj_stack ) + continuation->pstack-list + 2dup >R >R + + ( Allocate stack space first using psp!, + then copy objects from list. ) + + car drop + object-stack-base @ psp0 + + psp! + + R> R> 2dup cdr + 2swap + car drop 2- 0 swap do + + 2dup car + PSP0 object-stack-base @ + i + 2 + ! + PSP0 object-stack-base @ + i + 1 + ! + cdr + + -2 +loop + + 2drop +; + +: list->pad ( list -- n ) + + 2dup car drop -rot \ keep length of list on stack + 2dup cdr 2swap car drop \ get length from list + + pad + 1- \ final dest addr + pad \ initial dest addr + swap + do + 2dup cdr 2swap car + drop i ! + -1 +loop + + 2drop +; + +: restore-return-stack ( continuation -- ) + + trace + + continuation->rstack-list + list->pad + dup + RSP0 + RSP! \ expand return stack to accommodate entries + + 0 \ initial offset + do + pad i + @ RSP0 i 1+ + ! + loop + + trace +; + +: restore-continuation ( continuation -- ) + \ TODO: replace current parameter and return stacks with + \ contents of continuation object. + + 2dup >R >R + restore-param-stack + + ." ====== PARAM STACK RESTORED ======" cr + trace + + R> R> + restore-return-stack +; + +\ }}} + \ ---- Primitives ---- {{{ : make-primitive ( cfa -- ) @@ -1661,6 +1777,10 @@ parse-idx-stack parse-idx-sp ! ['] evaluate-eproc goto endof + continuation-type of + \ TODO: Apply continuation + endof + except-message: ." object '" drop print ." ' not applicable." recoverable-exception throw endcase ; @@ -1909,6 +2029,9 @@ parse-idx-stack parse-idx-sp ! : printcomp ( primobj -- ) 2drop ." " ; +: printcont ( primobj --) + 2drop ." " ; + : printnone ( noneobj -- ) 2drop ." Unspecified return value" ; @@ -1927,6 +2050,7 @@ parse-idx-stack parse-idx-sp ! pair-type istype? if ." (" printpair ." )" exit then primitive-proc-type istype? if printprim exit then compound-proc-type istype? if printcomp exit then + continuation-type istype? if printcont exit then none-type istype? if printnone exit then port-type istype? if printport exit then @@ -1951,14 +2075,6 @@ parse-idx-stack parse-idx-sp ! or in other variables than the above will result in possible memory corruption if the cons triggers the GC. ) -variable gc-stack-depth - -: enable-gc - depth gc-stack-depth ! - true gc-enabled ! ; - -: disable-gc - false gc-enabled ! ; : pairlike? ( obj -- obj bool ) pair-type istype? if true exit then @@ -2035,7 +2151,7 @@ variable gc-stack-depth console-i/o-port obj@ gc-mark-obj global-env obj@ gc-mark-obj - depth gc-stack-depth @ do + depth object-stack-base @ do PSP0 i + 1 + @ PSP0 i + 2 + @ @@ -2049,6 +2165,9 @@ variable gc-stack-depth \ }}} +\ DEBUGGING +xxxx + \ ---- Loading files ---- {{{ : load ( addr n -- finalResult ) @@ -2084,11 +2203,8 @@ variable gc-stack-depth include scheme-primitives.4th - enable-gc - + init-object-stack-base s" scheme-library.scm" load 2drop - - disable-gc \ }}} @@ -2116,7 +2232,7 @@ variable gc-stack-depth : repl empty-parse-str - enable-gc + init-object-stack-base \ Display welcome message welcome-symbol nil cons global-env obj@ eval 2drop @@ -2130,8 +2246,6 @@ variable gc-stack-depth throw false endcase until - - disable-gc ; forth definitions