X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=scheme.forth.jl.git;a=blobdiff_plain;f=src%2Fscheme-primitives.4th;h=9203f71c721c26b0c7d887747a395dfbd1523c2b;hp=edf5894ab5e87962b15abc78991e5d260f775058;hb=73373387ae07d9da0ee049d96338555707b6d7b7;hpb=a39894e12a9e84a17411e3bdd5d49fae3369e0d4 diff --git a/src/scheme-primitives.4th b/src/scheme-primitives.4th index edf5894..9203f71 100644 --- a/src/scheme-primitives.4th +++ b/src/scheme-primitives.4th @@ -1,52 +1,36 @@ \ ==== Type predicates ==== {{{ :noname ( args -- boolobj ) - 2dup 1 ensure-arg-count - - car nil objeq? boolean-type -; make-primitive null? + nil objeq? boolean-type +; 1 make-fa-primitive null? :noname ( args -- boolobj ) - 2dup 1 ensure-arg-count - - car boolean-type istype? -rot 2drop boolean-type -; make-primitive boolean? + boolean-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive boolean? :noname ( args -- boolobj ) - 2dup 1 ensure-arg-count - - car symbol-type istype? -rot 2drop boolean-type -; make-primitive symbol? + symbol-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive symbol? :noname ( args -- boolobj ) - 2dup 1 ensure-arg-count - - car fixnum-type istype? -rot 2drop boolean-type -; make-primitive integer? + fixnum-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive fixnum? :noname ( args -- boolobj ) - 2dup 1 ensure-arg-count - - car character-type istype? -rot 2drop boolean-type -; make-primitive char? + character-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive char? :noname ( args -- boolobj ) - 2dup 1 ensure-arg-count - - car string-type istype? -rot 2drop boolean-type -; make-primitive string? + string-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive string? :noname ( args -- boolobj ) - 2dup 1 ensure-arg-count - - car pair-type istype? -rot 2drop boolean-type -; make-primitive pair? + pair-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive pair? :noname ( args -- boolobj ) - 2dup 1 ensure-arg-count - - car primitive-proc-type istype? -rot 2drop boolean-type -; make-primitive procedure? + primitive-proc-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive procedure? \ }}} @@ -157,224 +141,138 @@ \ }}} -\ ==== Arithmetic ==== {{{ - -: add-prim ( args -- fixnum ) - 2dup nil objeq? if - 2drop - 0 fixnum-type - else - 2dup car drop - -rot cdr recurse drop - + fixnum-type - then -; -' add-prim make-primitive + - -:noname ( args -- fixnum ) - 2dup nil objeq? if - 2drop - 0 fixnum-type - else - 2dup car drop - -rot cdr - 2dup nil objeq? if - 2drop negate - else - add-prim drop - - - then - fixnum-type - then -; make-primitive - - -:noname ( args -- fixnum ) - 2dup nil objeq? if - 2drop - 1 fixnum-type - else - 2dup car drop - -rot cdr recurse drop - * fixnum-type - 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 +\ ==== Primitivle Arithmetic ==== {{{ - drop swap drop +\ --- Fixnums --- - / fixnum-type -; make-primitive quotient +:noname ( fixnum fixnum -- boolobj ) + objeq? boolean-type +; 2 make-fa-primitive fix:= -:noname ( args -- fixnum ) - 2dup 2 ensure-arg-count +:noname ( fixnum fixnum -- boolobj ) + drop swap drop < boolean-type +; 2 make-fa-primitive fix:< - 2dup car fixnum-type ensure-arg-type - 2swap cdr car fixnum-type ensure-arg-type +:noname ( fixnum fixnum -- boolobj ) + drop swap drop > boolean-type +; 2 make-fa-primitive fix:> - drop swap drop +:noname ( fixnum fixnum -- boolobj ) + drop swap drop <= boolean-type +; 2 make-fa-primitive fix:<= - mod fixnum-type -; make-primitive remainder +:noname ( fixnum fixnum -- boolobj ) + drop swap drop >= boolean-type +; 2 make-fa-primitive fix:>= -variable relcfa +:noname ( fixnum fixnum -- boolobj ) + drop 0= boolean-type +; 1 make-fa-primitive fix:zero? -: test-relation ( args -- bool ) +:noname ( fixnum fixnum -- boolobj ) + drop 0> boolean-type +; 1 make-fa-primitive fix:positive? - 2dup nil objeq? if - 2drop - true boolean-type exit - then +:noname ( fixnum fixnum -- boolobj ) + drop 0< boolean-type +; 1 make-fa-primitive fix:negative? - ( args ) +:noname ( fixnum fixnum -- fixnum' ) + drop swap drop + fixnum-type +; 2 make-fa-primitive fix:+ - 2dup car fixnum-type ensure-arg-type ( args arg0 ) - 2swap cdr ( arg0 args' ) +:noname ( fixnum fixnum -- fixnum' ) + drop swap drop - fixnum-type +; 2 make-fa-primitive fix:- - 2dup nil objeq? if - 2drop 2drop - true boolean-type exit - then +:noname ( fixnum fixnum -- fixnum' ) + drop swap drop * fixnum-type +; 2 make-fa-primitive fix:* - ( arg0 args' ) +:noname ( fixnum fixnum -- fixnum' ) + drop swap drop / fixnum-type +; 2 make-fa-primitive fix:quotient - 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 +:noname ( fixnum fixnum -- fixnum' ) + drop swap drop mod fixnum-type +; 2 make-fa-primitive fix:remainder - 2swap cdr ( arg0 args'' ) - repeat +:noname ( fixnum -- fixnum+1 ) + swap 1+ swap +; 1 make-fa-primitive fix:1+ - 2drop 2drop - true boolean-type -; +:noname ( fixnum -- fixnum-1 ) + swap 1- swap +; 1 make-fa-primitive fix:-1+ -: fixnum-lt ( obj1 obj2 -- bool ) - drop swap drop < -; +:noname ( fixnum -- -fixnum ) + swap negate swap +; 1 make-fa-primitive fix:neg -: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 = +( Find the GCD of n1 and n2 where n2 < n1. ) +: gcd ( n1 n2 -- m ) + ; -: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 +:noname ( arg1 arg2 -- pair ) cons -; make-primitive cons - -:noname ( args -- list ) - \ args is already a list! -; make-primitive list - -:noname ( args -- obj ) - 2dup 1 ensure-arg-count - car pair-type ensure-arg-type +; 2 make-fa-primitive cons +:noname ( pair-obj -- obj ) car -; make-primitive car +; pair-type 1 make-fa-type-primitive car :noname ( args -- obj ) - 2dup 1 ensure-arg-count - car pair-type ensure-arg-type - cdr -; make-primitive cdr +; pair-type 1 make-fa-type-primitive cdr -:noname ( args -- ok ) - 2dup 2 ensure-arg-count - 2dup cdr car - 2swap car pair-type ensure-arg-type +:noname ( pair obj -- ok ) + 2swap pair-type ensure-arg-type set-car! ok-symbol -; make-primitive set-car! +; 2 make-fa-primitive set-car! -:noname ( args -- ok ) - 2dup 2 ensure-arg-count - 2dup cdr car - 2swap car pair-type ensure-arg-type +:noname ( pair obj -- ok ) + 2swap pair-type ensure-arg-type set-cdr! ok-symbol -; make-primitive set-cdr! +; 2 make-fa-primitive set-cdr! \ }}} \ ==== Polymorphic equality testing ==== {{{ -:noname ( args -- bool ) - 2dup 2 ensure-arg-count - 2dup cdr car - 2swap car - +:noname ( arg1 arg2 -- bool ) objeq? boolean-type -; make-primitive eq? +; 2 make-fa-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 +; string-type 1 make-fa-type-primitive load :noname ( args -- obj ) - 0 ensure-arg-count read -; make-primitive read +; 0 make-fa-primitive read defer display -:noname ( args -- none ) - 2dup 1 ensure-arg-count - car print - - none -; make-primitive write +:noname ( obj -- none ) + print none +; 1 make-fa-primitive write : displaypair ( pairobj -- ) 2dup @@ -409,40 +307,21 @@ defer display 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 +:noname ( stringobj -- none ) + displaystring none +; string-type 1 make-fa-type-primitive display-string - display +:noname ( charobj -- none ) + displaychar none +; character-type 1 make-fa-type-primitive display-character - none -; make-primitive display +:noname ( obj -- none ) + display none +; 1 make-fa-primitive display :noname ( args -- none ) - 0 ensure-arg-count - - cr - - none -; make-primitive newline + cr none +; 0 make-fa-primitive newline \ }}} @@ -477,18 +356,14 @@ defer display ( Generate a temporary unique symbol. Used in the creation of hygienic macros. ) :noname ( args -- result ) - 0 ensure-arg-count - [char] _ character-type nil cons drop symbol-type -; make-primitive gensym +; 0 make-fa-primitive gensym ( Generate the NONE object indicating an unspecified return value. ) :noname ( args -- result ) - 0 ensure-arg-count - none -; make-primitive none +; 0 make-fa-primitive none \ }}}