X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme.4th;h=9a490539ea259917f160903018b578fd1c10f2bc;hb=62886ccdbb1bba3bf64abfb5b8f01cbf2c7f9f7e;hp=ea02cd513b424fd72efede52139568e87c758204;hpb=26a971100b29dee243a42096d52d69ca518905ea;p=scheme.forth.jl.git diff --git a/scheme.4th b/scheme.4th index ea02cd5..9a49053 100644 --- a/scheme.4th +++ b/scheme.4th @@ -1,5 +1,3 @@ -\ Scheme interpreter - vocabulary scheme scheme definitions @@ -8,6 +6,7 @@ include term-colours.4th 0 constant number-type 1 constant boolean-type 2 constant character-type +3 constant nil-type : istype? ( obj -- obj b ) over = ; @@ -134,11 +133,13 @@ parse-idx-stack parse-idx-sp ! ; : str-equiv? ( str -- bool ) + push-parse-idx - true + true -rot swap dup rot + swap + do i @ nextchar <> if drop false @@ -148,7 +149,7 @@ parse-idx-stack parse-idx-sp ! inc-parse-idx loop - delim? <> if drop false then + delim? false = if drop false then pop-parse-idx ; @@ -163,15 +164,24 @@ parse-idx-stack parse-idx-sp ! inc-parse-idx - S" newline" str-equiv? if true exit then - S" space" str-equiv? if true exit then - S" tab" str-equiv? if true exit then + S" newline" str-equiv? if pop-parse-idx true exit then + S" space" str-equiv? if pop-parse-idx true exit then + S" tab" str-equiv? if pop-parse-idx true exit then charavailable? false = if pop-parse-idx false exit then pop-parse-idx true ; +: empty-list? ( -- bool ) + nextchar [char] ( <> if false exit then + push-parse-idx + inc-parse-idx + eatspaces + nextchar [char] ) <> if pop-parse-idx false exit then + pop-parse-idx true ; + + : readnum ( -- num-atom ) minus? dup if inc-parse-idx @@ -207,15 +217,23 @@ parse-idx-stack parse-idx-sp ! inc-parse-idx inc-parse-idx - S" newline" str-equiv? if '\n' character-type exit then - S" space" str-equiv? if bl character-type exit then - S" tab" str-equiv? if 9 character-type exit then + S" newline" str-equiv? if 7 parse-idx +! '\n' character-type exit then + S" space" str-equiv? if 5 parse-idx +! bl character-type exit then + S" tab" str-equiv? if 3 parse-idx +! 9 character-type exit then nextchar character-type inc-parse-idx ; +: readnil ( -- nil-atom ) + inc-parse-idx + eatspaces + inc-parse-idx + + nil-type +; + \ Parse a scheme expression : read ( -- obj ) @@ -236,6 +254,11 @@ parse-idx-stack parse-idx-sp ! exit then + empty-list? if + readnil + exit + then + eof? if bold fg blue ." Moriturus te saluto." reset-term ." ok" cr quit @@ -252,6 +275,8 @@ parse-idx-stack parse-idx-sp ! : self-evaluating? ( obj -- obj bool ) number-type istype? if true exit then boolean-type istype? if true exit then + character-type istype? if true exit then + nil-type istype? if true exit then false ; : eval @@ -281,14 +306,20 @@ parse-idx-stack parse-idx-sp ! 9 of ." #\tab" endof bl of ." #\space" endof '\n' of ." #\newline" endof + + dup ." #\" emit endcase ; +: printnil ( nilobj -- ) + drop ." ()" ; + : print ( obj -- ) ." ; " number-type istype? if printnum exit then boolean-type istype? if printbool exit then character-type istype? if printchar exit then + nil-type istype? if printnil exit then ; \ ---- REPL ----