X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme.4th;h=72897bedbec770f312f62e273db0b0d9a45b600c;hb=85e14c9d3e9509418125d2a7a6b7fa366a8f31ad;hp=fa53d670558d12cfc24fc8dfab2af92ffa9a224c;hpb=8772ce0cfd9d1140df94efcad344deb931101f42;p=scheme.forth.jl.git diff --git a/scheme.4th b/scheme.4th index fa53d67..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,17 +277,37 @@ global-env setobj global-env fetchobj define-var ; -: add-prim ( args -- ) - nil objeq? if - 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 +; + +: 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 ; -' add-prim make-primitive + +include scheme-primitives.4th \ }}} @@ -357,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 ) @@ -373,10 +408,23 @@ parse-idx-stack parse-idx-sp ! : minus? ( -- bool ) nextchar [char] - = ; -: number? ( -- bool ) - digit? minus? or false = if - false - exit +: plus? ( -- bool ) + nextchar [char] + = ; + +: fixnum? ( -- bool ) + minus? plus? or if + inc-parse-idx + + delim? if + dec-parse-idx + false exit + else + dec-parse-idx + then + else + digit? false = if + false exit + then then push-parse-idx @@ -463,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 @@ -476,7 +527,7 @@ parse-idx-stack parse-idx-sp ! swap if negate then - number-type + fixnum-type ; : readbool ( -- bool-atom ) @@ -649,7 +700,7 @@ parse-idx-stack parse-idx-sp ! eatspaces - number? if + fixnum? if readnum exit then @@ -722,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 @@ -821,7 +872,7 @@ defer eval : true? ( boolobj -- bool ) false? invert ; -: applicaion? ( obj -- obj bool) +: application? ( obj -- obj bool) pair-type istype? ; : operator ( obj -- operator ) @@ -982,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