X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme-primitives.4th;h=fdb28d37e1eb911251a0dd60f80e73bfe7b8f787;hb=e0ca5b6fd7381323cb9737f0ca6bfec9ede3eb7d;hp=03d885bebd3cce1f9b02e4be224c4e020fbb9869;hpb=9ad6e6f21fbbefe9e38bc6b4b8d2a78f8cbca229;p=scheme.forth.jl.git diff --git a/scheme-primitives.4th b/scheme-primitives.4th index 03d885b..fdb28d3 100644 --- a/scheme-primitives.4th +++ b/scheme-primitives.4th @@ -1,4 +1,4 @@ -( = Type predicates = ) +( ==== Type predicates ==== ) :noname ( args -- boolobj ) 2dup 1 ensure-arg-count @@ -45,10 +45,10 @@ :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 = ) +( ==== Type conversions ==== ) :noname ( args -- fixnum ) 2dup 1 ensure-arg-count @@ -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 @@ -148,7 +153,7 @@ charlist>symbol ; make-primitive string->symbol -( = Arithmetic = ) +( ==== Arithmetic ==== ) : add-prim ( args -- fixnum ) 2dup nil objeq? if @@ -212,9 +217,12 @@ mod fixnum-type ; make-primitive remainder -:noname ( args -- bool ) +variable relcfa + +: test-relation ( args -- bool ) 2dup nil objeq? if + 2drop true boolean-type exit then @@ -234,8 +242,8 @@ 2dup nil objeq? false = while 2dup car fixnum-type ensure-arg-type ( arg0 args' arg1 ) - 2rot 2dup 2rot ( args' arg0 arg0 arg1 ) - objeq? false = if + 2rot 2swap 2dup 2rot 2swap ( args' arg1 arg1 arg0 ) + relcfa @ execute false = if 2drop 2drop false boolean-type exit then @@ -245,9 +253,38 @@ 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 = -( = Pairs and Lists = ) +hide relcfa + +( ==== Pairs and Lists ==== ) :noname ( args -- pair ) 2dup 2 ensure-arg-count @@ -294,7 +331,7 @@ ok-symbol ; make-primitive set-cdr! -( = Polymorphic equality testing = ) +( ==== Polymorphic equality testing ==== ) :noname ( args -- bool ) 2dup 2 ensure-arg-count @@ -303,3 +340,119 @@ objeq? boolean-type ; make-primitive eq? + +( ==== Input/Output ==== ) + +:noname ( args -- finalResult ) + 2dup 1 ensure-arg-count + car string-type ensure-arg-type + + drop pair-type + pad charlist>cstr + pad swap load +; make-primitive load + +' read make-primitive read + +defer display +:noname ( args -- none ) + 2dup 1 ensure-arg-count + + car print + + none +; make-primitive write + +: displaypair ( pairobj -- ) + 2dup + car display + cdr + nil? if 2drop exit then + pair-type istype? if space recurse exit then + ." . " display +; + +: displaychar ( charobj -- ) + drop emit ; + +: (displaystring) ( charlist -- ) + nil? if + 2drop + else + 2dup car displaychar + cdr recurse + then +; + +: displaystring ( stringobj -- ) + drop pair-type (displaystring) +; + +:noname ( obj -- ) + pair-type istype? if ." (" displaypair ." )" exit then + character-type istype? if displaychar exit then + string-type istype? if displaystring exit then + + print +; is display + +:noname ( args -- none ) + 2dup 1 ensure-arg-count + car string-type ensure-arg-type + + displaystring + + none +; make-primitive display-string + +:noname ( args -- none ) + 2dup 1 ensure-arg-count + car character-type ensure-arg-type + + displaychar + + none +; make-primitive display-character + +:noname ( args -- none ) + 2dup 1 ensure-arg-count + car + + display + + none +; make-primitive display + +:noname ( args -- none ) + 0 ensure-arg-count + + cr + + none +; make-primitive newline + +( ==== Evaluation ==== ) + +:noname ( args -- result ) + 2dup car 2swap cdr + + nil? false = if car then ( proc argvals ) + + apply +; make-primitive apply + +( ==== Error System ==== ) + +:noname ( args -- result ) + bold fg red + + nil? if + ." Error." + else + ." Error: " car display + then + + reset-term + + recoverable-exception throw +; make-primitive error