X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme.4th;h=72897bedbec770f312f62e273db0b0d9a45b600c;hb=85e14c9d3e9509418125d2a7a6b7fa366a8f31ad;hp=8da2772ef290dd9107860d037cd2134990143cb6;hpb=c2f2262e11ea022568bc7cbb43f666baf89236e7;p=scheme.forth.jl.git diff --git a/scheme.4th b/scheme.4th index 8da2772..72897be 100644 --- a/scheme.4th +++ b/scheme.4th @@ -6,7 +6,7 @@ include defer-is.4th \ ------ Types ------ -0 constant number-type +0 constant fixnum-type 1 constant boolean-type 2 constant character-type 3 constant string-type @@ -277,16 +277,37 @@ global-env setobj global-env fetchobj define-var ; -:noname ( args -- ) - 2dup nil objeq? if - 2drop - 0 number-type +: arg-count-error + bold fg red ." Incorrect argument count." reset-term cr + abort +; + +: ensure-arg-count ( args n -- ) + dup 0= if + drop nil objeq? false = if + arg-count-error + then else - 2dup cdr recurse drop - -rot car drop - + number-type + -rot 2dup nil objeq? if + arg-count-error + then + + cdr rot 1- recurse then -; make-primitive + +; + +: arg-type-error + bold fg red ." Incorrect argument type." reset-term cr + abort +; + +: ensure-arg-type ( arg type -- arg ) + istype? false = if + arg-type-error + then +; + +include scheme-primitives.4th \ }}} @@ -356,12 +377,27 @@ parse-idx-stack parse-idx-sp ! nextchar [char] ) = or ; +: commentstart? ( -- bool ) + nextchar [char] ; = ; + : eatspaces + + false \ Indicates whether or not we're eating a comment + begin - whitespace? + dup whitespace? or commentstart? or while + dup nextchar '\n' = and if + invert \ Stop eating comment + else + dup false = commentstart? and if + invert \ Begin eating comment + then + then + inc-parse-idx repeat + drop ; : digit? ( -- bool ) @@ -372,8 +408,11 @@ parse-idx-stack parse-idx-sp ! : minus? ( -- bool ) nextchar [char] - = ; -: number? ( -- bool ) - minus? if +: plus? ( -- bool ) + nextchar [char] + = ; + +: fixnum? ( -- bool ) + minus? plus? or if inc-parse-idx delim? if @@ -472,8 +511,11 @@ parse-idx-stack parse-idx-sp ! nextchar [char] " = ; : readnum ( -- num-atom ) - minus? dup if + plus? minus? or if + minus? inc-parse-idx + else + false then 0 @@ -485,7 +527,7 @@ parse-idx-stack parse-idx-sp ! swap if negate then - number-type + fixnum-type ; : readbool ( -- bool-atom ) @@ -658,7 +700,7 @@ parse-idx-stack parse-idx-sp ! eatspaces - number? if + fixnum? if readnum exit then @@ -731,7 +773,7 @@ defer eval : self-evaluating? ( obj -- obj bool ) boolean-type istype? if true exit then - number-type istype? if true exit then + fixnum-type istype? if true exit then character-type istype? if true exit then string-type istype? if true exit then nil-type istype? if true exit then @@ -991,7 +1033,7 @@ defer print 2drop ." " ; :noname ( obj -- ) - number-type istype? if printnum exit then + fixnum-type istype? if printnum exit then boolean-type istype? if printbool exit then character-type istype? if printchar exit then string-type istype? if printstring exit then