Added some type conversion prims.
[scheme.forth.jl.git] / scheme.4th
index fa53d67..644ee19 100644 (file)
@@ -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
 ;
 
-' add-prim make-primitive +
+: arg-type-error
+            bold fg red ." Incorrect argument type." reset-term cr
+            abort
+;
+
+: ensure-arg-type ( arg type -- )
+    istype? false = if
+        arg-type-error
+    then
+;
+
+include scheme-primitives.4th
 
 \ }}}
 
@@ -373,10 +393,20 @@ parse-idx-stack parse-idx-sp !
 : minus? ( -- bool )
     nextchar [char] - = ;
 
-: number? ( -- bool )
-    digit? minus? or false = if
-        false
-        exit
+: fixnum? ( -- bool )
+    minus? 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
@@ -476,7 +506,7 @@ parse-idx-stack parse-idx-sp !
 
     swap if negate then
 
-    number-type
+    fixnum-type
 ;
 
 : readbool ( -- bool-atom )
@@ -649,7 +679,7 @@ parse-idx-stack parse-idx-sp !
 
     eatspaces
 
-    number? if
+    fixnum? if
         readnum
         exit
     then
@@ -722,7 +752,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 +851,7 @@ defer eval
 : true? ( boolobj -- bool )
     false? invert ;
 
-: applicaion? ( obj -- obj bool)
+: application? ( obj -- obj bool)
     pair-type istype? ;
 
 : operator ( obj -- operator )
@@ -982,7 +1012,7 @@ defer print
     2drop ." <primitive procedure>" ;
 
 :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