X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme-primitives.4th;h=1d2e21cce5fad83704e5d38776a28e55a1995945;hb=4d9d90cad9c4280d93d6bf67f2083ef9d3c8235f;hp=b26805114d207d037c65f181104bdd7662b3aa82;hpb=af4ada618d8d096645f783f40508a1bd6ad0d95d;p=scheme.forth.jl.git diff --git a/scheme-primitives.4th b/scheme-primitives.4th index b268051..1d2e21c 100644 --- a/scheme-primitives.4th +++ b/scheme-primitives.4th @@ -45,7 +45,7 @@ :noname ( args -- boolobj ) 2dup 1 ensure-arg-count - car primitive-type istype? -rot 2drop boolean-type + car primitive-proc-type istype? -rot 2drop boolean-type ; make-primitive procedure? ( = Type conversions = ) @@ -64,34 +64,39 @@ drop character-type ; make-primitive integer->char -: num-to-charlist ( num -- charlist ) - ?dup 0= if +: fixnum-to-charlist ( fixnum -- charlist ) + over 0= if + 2drop [char] 0 character-type nil cons exit then - nil rot + nil 2swap ( charlist fixnum ) begin - ?dup 0> + over 0> while - dup 10 mod swap 10 / swap - 2swap rot - [char] 0 + character-type 2swap - cons - rot + 2dup swap 10 mod swap ( charlist fixnum fixnummod ) + 2swap swap 10 / swap ( charlist fixnummod fixnumdiv ) + -2rot ( fixnumdiv charlist fixnummod ) + + drop [char] 0 + character-type 2swap + cons ( fixnumdiv newcharlist ) + + 2swap repeat + + 2drop ; :noname ( args -- string ) 2dup 1 ensure-arg-count car fixnum-type ensure-arg-type - drop + 2dup swap abs swap - dup 0< swap abs ( bool num ) - num-to-charlist - rot if + fixnum-to-charlist ( fixnum charlist ) + 2swap drop 0< if [char] - character-type 2swap cons then @@ -130,6 +135,24 @@ fixnum-type ; make-primitive string->number +:noname ( args -- string ) + 2dup 1 ensure-arg-count + car symbol-type ensure-arg-type + + drop pair-type + duplicate-charlist + drop string-type +; make-primitive symbol->string + +:noname ( args -- symbol ) + 2dup 1 ensure-arg-count + car string-type ensure-arg-type + + drop pair-type + duplicate-charlist + charlist>symbol +; make-primitive string->symbol + ( = Arithmetic = ) : add-prim ( args -- fixnum ) @@ -150,8 +173,14 @@ 0 fixnum-type else 2dup car drop - -rot cdr add-prim drop - - fixnum-type + -rot cdr + 2dup nil objeq? if + 2drop negate + else + add-prim drop + - + then + fixnum-type then ; make-primitive - @@ -166,3 +195,148 @@ then ; make-primitive * +:noname ( args -- fixnum ) + 2dup 2 ensure-arg-count + + 2dup car fixnum-type ensure-arg-type + 2swap cdr car fixnum-type ensure-arg-type + + drop swap drop + + / fixnum-type +; make-primitive quotient + +:noname ( args -- fixnum ) + 2dup 2 ensure-arg-count + + 2dup car fixnum-type ensure-arg-type + 2swap cdr car fixnum-type ensure-arg-type + + drop swap drop + + 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?