Primitive fixnum relations working.
[scheme.forth.jl.git] / scheme-primitives.4th
index c99a0c0..9afc2c2 100644 (file)
 
     mod fixnum-type
 ; make-primitive remainder
+
+variable relcfa
+
+: test-relation ( args -- bool )
+
+    2dup nil objeq? if
+        2drop
+        true boolean-type exit
+    then
+
+    ( args )
+
+    2dup car fixnum-type ensure-arg-type ( args arg0 )
+    2swap cdr ( arg0 args' )
+
+    2dup nil objeq? if
+        2drop 2drop
+        true boolean-type exit
+    then
+
+    ( arg0 args' )
+
+    begin
+        2dup nil objeq? false =
+    while
+        2dup car fixnum-type ensure-arg-type ( arg0 args' arg1 )
+        2rot 2swap 2dup 2rot 2swap ( args' arg1 arg1 arg0 )
+        relcfa @ execute false = if
+            2drop 2drop
+            false boolean-type exit
+        then
+
+        2swap cdr ( arg0 args'' )
+    repeat
+
+    2drop 2drop
+    true boolean-type
+; 
+
+: fixnum-lt ( obj1 obj2 -- bool )
+    drop swap drop <
+;
+
+:noname
+    ['] fixnum-lt relcfa !
+    test-relation
+; make-primitive <
+
+: fixnum-gt ( obj1 obj2 -- bool )
+    drop swap drop >
+;
+
+:noname
+    ['] fixnum-gt relcfa !
+    test-relation
+; make-primitive >
+
+: fixnum-eq ( obj1 obj2 -- bool )
+    drop swap drop =
+;
+
+:noname
+    ['] fixnum-eq relcfa !
+    test-relation
+; make-primitive =
+
+hide relcfa
+
+( = Pairs and Lists = )
+
+:noname ( args -- pair )
+    2dup 2 ensure-arg-count
+
+    2dup car 2swap cdr car
+    cons
+; make-primitive cons
+
+:noname ( args -- list )
+    \ args is already a list!
+; make-primitive list
+
+:noname ( args -- pair )
+    2dup 1 ensure-arg-count
+    car pair-type ensure-arg-type
+
+    car
+; make-primitive car
+
+:noname ( args -- pair )
+    2dup 1 ensure-arg-count
+    car pair-type ensure-arg-type
+
+    cdr
+; make-primitive cdr
+
+:noname ( args -- pair )
+    2dup 2 ensure-arg-count
+    2dup cdr car
+    2swap car pair-type ensure-arg-type
+
+    set-car!
+
+    ok-symbol
+; make-primitive set-car!
+
+:noname ( args -- pair )
+    2dup 2 ensure-arg-count
+    2dup cdr car
+    2swap car pair-type ensure-arg-type
+
+    set-cdr!
+
+    ok-symbol
+; make-primitive set-cdr!
+
+( = Polymorphic equality testing = )
+
+:noname ( args -- bool )
+    2dup 2 ensure-arg-count
+    2dup cdr car
+    2swap car
+
+    objeq? boolean-type
+; make-primitive eq?