X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fscheme.4th;h=48c363a9a1fda82c6031b189a4a9a2c12f728336;hb=899e3f7a10cbb8ecd03aa2dfe3ad08bf4638a324;hp=d6dccd1c7d91aaf44c81693b7e4cb9005d519a76;hpb=3f60507c407dc22a19b4539d08cc926c54141653;p=scheme.forth.jl.git diff --git a/src/scheme.4th b/src/scheme.4th index d6dccd1..48c363a 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 = ; @@ -62,7 +63,7 @@ variable nextexception make-exception recoverable-exception make-exception unrecoverable-exception -: throw reset-term throw ; +: throw reset-term cr throw ; \ }}} @@ -75,6 +76,12 @@ 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 @@ -90,7 +97,9 @@ variable nextfree nextfree ! nextfree @ scheme-memsize >= if - collect-garbage + gc-enabled? if + collect-garbage + then then nextfree @ scheme-memsize >= if @@ -1661,6 +1670,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 +1922,9 @@ parse-idx-stack parse-idx-sp ! : printcomp ( primobj -- ) 2drop ." " ; +: printcont ( primobj --) + 2drop ." " ; + : printnone ( noneobj -- ) 2drop ." Unspecified return value" ; @@ -1927,6 +1943,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 @@ -1937,9 +1954,6 @@ parse-idx-stack parse-idx-sp ! \ ---- Garbage Collection ---- {{{ -variable gc-enabled -false gc-enabled ! - variable gc-stack-depth : enable-gc @@ -1949,9 +1963,6 @@ variable gc-stack-depth : disable-gc false gc-enabled ! ; -: gc-enabled? - gc-enabled @ ; - : pairlike? ( obj -- obj bool ) pair-type istype? if true exit then string-type istype? if true exit then @@ -2018,9 +2029,7 @@ variable gc-stack-depth ; :noname - ." GC! " - - trace + \ ." GC! " gc-unmark @@ -2038,7 +2047,7 @@ variable gc-stack-depth gc-sweep - ." (" gc-count-marked . ." pairs marked as used.)" cr + \ ." (" gc-count-marked . ." pairs marked as used.)" cr ; is collect-garbage \ }}} @@ -2054,12 +2063,12 @@ variable gc-stack-depth begin \ DEBUG - bold fg blue ." READ from " 2over drop . ." ==> " reset-term + \ bold fg blue ." READ from " 2over drop . ." ==> " reset-term 2over read-port ( port res obj ) \ DEBUG - 2dup print cr + \ 2dup print cr 2dup EOF character-type objeq? if 2drop 2swap close-port @@ -2078,7 +2087,11 @@ variable gc-stack-depth include scheme-primitives.4th + enable-gc + s" scheme-library.scm" load 2drop + + disable-gc \ }}} @@ -2109,7 +2122,7 @@ variable gc-stack-depth enable-gc \ Display welcome message - \ welcome-symbol nil cons global-env obj@ eval 2drop + welcome-symbol nil cons global-env obj@ eval 2drop begin ['] repl-body catch @@ -2120,6 +2133,8 @@ variable gc-stack-depth throw false endcase until + + disable-gc ; forth definitions