X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fscheme-primitives.4th;h=1e37e0d5bd3e20451ff21e355a72b730abfab3da;hb=5c89ece636005a3008eb27a80b0c805b4d0e4c84;hp=7e123f71184d496b628d6571e323000b580ceada;hpb=007ee2a4d8f3b87779599f06512973c92d0640e8;p=scheme.forth.jl.git diff --git a/src/scheme-primitives.4th b/src/scheme-primitives.4th index 7e123f7..1e37e0d 100644 --- a/src/scheme-primitives.4th +++ b/src/scheme-primitives.4th @@ -20,6 +20,10 @@ flonum-type istype? -rot 2drop boolean-type ; 1 make-fa-primitive flonum? +:noname ( args -- boolobj ) + ratnum-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive ratnum? + :noname ( args -- boolobj ) character-type istype? -rot 2drop boolean-type ; 1 make-fa-primitive char? @@ -42,6 +46,10 @@ -rot 2drop boolean-type ; 1 make-fa-primitive procedure? +:noname ( args -- boolobj ) + port-type istype? -rot 2drop boolean-type +; 1 make-fa-primitive port? + \ }}} \ ==== Type conversions ==== {{{ @@ -149,6 +157,37 @@ charlist>symbol ; make-primitive string->symbol +:noname ( charlist -- string ) + 2dup 1 ensure-arg-count + + car nil? if + 2drop + nil nil cons + drop string-type + exit + then + + pair-type ensure-arg-type + + duplicate-charlist + drop string-type +; make-primitive list->string + +:noname ( string -- charlist ) + 2dup 1 ensure-arg-count + car string-type ensure-arg-type + + drop pair-type + + 2dup car nil? if + 2swap 2drop + else + 2drop + duplicate-charlist + then + +; make-primitive string->list + \ }}} \ ==== Numeric types ==== {{{ @@ -223,23 +262,6 @@ swap abs swap ; 1 make-fa-primitive fix:abs -: sort-pair - 2dup > if - swap - then -; - -( Find the GCD of n1 and n2 where n2 < n1. ) -: gcd ( n1 n2 -- m ) - sort-pair - over 0= if - swap drop - else - over mod - recurse - then -; - :noname ( fixnum fixnum -- fixnum' ) drop swap drop gcd fixnum-type ; 2 make-fa-primitive fix:gcd @@ -383,6 +405,17 @@ drop swap drop f/ fatan flonum-type ; 2 make-fa-primitive flo:atan2 +\ --- Rationals --- + +' make-rational 2 make-fa-primitive make-rational + +:noname ( ratnum -- fixnum ) + drop pair-type car +; 1 make-fa-primitive rat:numerator + +:noname ( ratnum -- fixnum ) + drop pair-type cdr +; 1 make-fa-primitive rat:denominator \ --- Conversion --- @@ -434,6 +467,62 @@ \ ==== Input/Output ==== {{{ +:noname ( -- port ) + console-i/o-port obj@ +; 0 make-fa-primitive console-i/o-port + +:noname ( -- port ) + current-input-port obj@ +; 0 make-fa-primitive current-input-port + +:noname ( args -- charobj ) + nil? if + 2drop current-input-port obj@ + else + car port-type ensure-arg-type + then + + read-char +; make-primitive read-char + +:noname ( args -- charobj ) + nil? if + 2drop current-input-port obj@ + else + car port-type ensure-arg-type + then + + peek-char +; make-primitive peek-char + +:noname ( args -- stringobj ) + nil? if + 2drop current-input-port obj@ + else + car port-type ensure-arg-type + then + + read-line +; make-primitive read-line + +: charlist>cstr ( charlist addr -- n ) + + dup 2swap ( origaddr addr charlist ) + + begin + nil? false = + while + 2dup cdr 2swap car + drop ( origaddr addr charlist char ) + -rot 2swap ( origaddr charlist addr char ) + over ! + 1+ -rot ( origaddr nextaddr charlist ) + repeat + + 2drop ( origaddr finaladdr ) + swap - +; + :noname ( args -- finalResult ) drop pair-type pad charlist>cstr @@ -522,7 +611,14 @@ defer display nil? if ." Error." else - ." Error: " car display + ." Error: " + + begin + 2dup car print + cdr nil? + until + + 2drop then reset-term