~ chicken-core (chicken-5) bce5af534277f4fc408575407f0c65d6183e8525
commit bce5af534277f4fc408575407f0c65d6183e8525 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Aug 18 13:07:09 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Aug 18 13:07:09 2011 +0200 use general matcher also for specialization; many fixes; started with adapted types.db.new diff --git a/common-declarations.scm b/common-declarations.scm index e1bea2df..ddae44ba 100644 --- a/common-declarations.scm +++ b/common-declarations.scm @@ -25,7 +25,7 @@ (declare - (specialize) + ;XXX (specialize) (usual-integrations)) (cond-expand diff --git a/compiler-namespace.scm b/compiler-namespace.scm index 90963b00..766c21d4 100644 --- a/compiler-namespace.scm +++ b/compiler-namespace.scm @@ -200,7 +200,6 @@ make-variable-list mark-variable match-node - match-specialization membership-test-operators membership-unfold-limit no-argc-checks diff --git a/manual/Types b/manual/Types index d8b4bcd3..70c51491 100644 --- a/manual/Types +++ b/manual/Types @@ -90,6 +90,7 @@ or {{:}} should follow the syntax given below: <table> <tr><th>VALUETYPE</th><th>meaning</th></tr> <tr><td>{{(or VALUETYPE ...)}}</td><td>"union" or "sum" type</td></tr> +<tr><td>{{(not VALUETYPE)}}</td><td>non-matching type (*)</td></tr> <tr><td>{{(struct STRUCTURENAME)}}</td><td>record structure of given kind</td></tr> <tr><td>{{(procedure [NAME] (VALUETYPE ... [#!optional VALUETYPE ...] [#!rest [VALUETYPE]]) . RESULTS)}}</td><td>procedure type, optionally with name</td></tr> <tr><td>{{(VALUETYPE ... [#!optional VALUETYPE ...] [#!rest [VALUETYPE]] -> . RESULTS)}}</td><td>alternative procedure type syntax</td></tr> @@ -141,6 +142,8 @@ or {{:}} should follow the syntax given below: <tr><td>VALUETYPE</td><td></td></tr> </table> +(*) Note: no type-variables are bound inside {{(not TYPE)}}. + ==== Predicates diff --git a/scrutinizer.scm b/scrutinizer.scm index 2b5a9222..9ecd2bba 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -26,11 +26,11 @@ (declare (unit scrutinizer) - (hide match-specialization specialize-node! specialization-statistics + (hide specialize-node! specialization-statistics procedure-type? named? procedure-result-types procedure-argument-types noreturn-type? rest-type procedure-name d-depth noreturn-procedure-type? trail trail-restore - compatible-types? type<=? initial-argument-types)) + compatible-types? type<=? match-types resolve match-argument-types)) (include "compiler-namespace") @@ -56,6 +56,7 @@ ; ; SPEC = * | (VAL1 ...) ; VAL = (or VAL1 ...) +; | (not VAL) ; | (struct NAME) ; | (procedure [NAME] (VAL1 ... [#!optional VALOPT1 ...] [#!rest [VAL | values]]) . RESULTS) ; | BASIC @@ -83,20 +84,13 @@ ; ; specialization specifiers: ; -; SPECIALIZATION = ((MVAL ... [#!rest MVAL]) [RESULTS] TEMPLATE) -; MVAL = VAL -; | (not MVAL) -; | (or MVAL ...) -; | (and MVAL ...) -; | (forall (VAR1 ...) MVAL) +; SPECIALIZATION = ((VAL ... [#!rest VAL]) [RESULTS] TEMPLATE) ; TEMPLATE = #(INDEX) ; | #(INDEX ...) ; | #(SYMBOL) ; | INTEGER | SYMBOL | STRING ; | (quote CONSTANT) ; | (TEMPLATE . TEMPLATE) -; -; - complex procedure types can currently not be matched (define-constant +fragment-max-length+ 6) @@ -270,131 +264,6 @@ len m m (map typename results)))))) - (define (match t1 t2 typeenv) - (define (match1 t1 t2) - (cond ((eq? t1 t2)) - ((and (symbol? t1) (assq t1 typeenv)) => - (lambda (e) - (if (cdr e) - (match1 (cdr e) t2) - (begin - (dd " unify ~a = ~a" t1 t2) - (set! trail (cons t1 trail)) - (set-cdr! e t2) - #t)))) - ((and (symbol? t2) (assq t2 typeenv)) => - (lambda (e) - (if (cdr e) - (match1 t1 (cdr e)) - (begin - (dd " unify ~a = ~a" t2 t1) - (set! trail (cons t2 trail)) - (set-cdr! e t1) - #t)))) - ((eq? t1 '*)) - ((eq? t2 '*)) - ((eq? t1 'noreturn)) - ((eq? t2 'noreturn)) - ((and (eq? t1 'number) (memq t2 '(number fixnum float)))) - ((and (eq? t2 'number) (memq t1 '(number fixnum float)))) - ((eq? 'procedure t1) (and (pair? t2) (eq? 'procedure (car t2)))) - ((eq? 'procedure t2) (and (pair? t1) (eq? 'procedure (car t1)))) - ((and (pair? t1) (eq? 'or (car t1))) (any (cut match1 <> t2) (cdr t1))) - ((and (pair? t2) (eq? 'or (car t2))) (any (cut match1 t1 <>) (cdr t2))) - ((and (pair? t1) (eq? 'forall (car t1))) - (match1 (third t1) t2)) ; assumes typeenv has already been extracted - ((and (pair? t2) (eq? 'forall (car t2))) - (match1 t1 (third t2))) ; assumes typeenv has already been extracted - ((eq? t1 'pair) (match1 '(pair * *) t2)) - ((eq? t2 'pair) (match1 t1 '(pair * *))) - ((eq? t1 'list) (match1 '(list *) t2)) - ((eq? t2 'list) (match1 t1 '(list *))) - ((eq? t1 'vector) (match1 '(vector *) t2)) - ((eq? t2 'vector) (match1 t1 '(vector *))) - ((eq? t1 'null) - (or (memq t2 '(null list)) - (and (pair? t2) (eq? 'list (car t2))))) - ((eq? t2 'null) - (or (memq t1 '(null list)) - (and (pair? t1) (eq? 'list (car t1))))) - ((and (pair? t1) (pair? t2) (eq? (car t1) (car t2))) - (case (car t1) - ((procedure) - (let ((args1 (if (named? t1) (third t1) (second t1))) - (args2 (if (named? t2) (third t2) (second t2))) - (results1 (if (named? t1) (cdddr t1) (cddr t1))) - (results2 (if (named? t2) (cdddr t2) (cddr t2))) ) - (and (match-args args1 args2 typeenv) - (match-results results1 results2 typeenv)))) - ((struct) (equal? t1 t2)) - ((pair) (every match1 (cdr t1) (cdr t2))) - ((list vector) (match1 (second t1) (second t2))) - (else #f) ) ) - ((and (pair? t1) (eq? 'pair (car t1))) - (and (pair? t2) - (eq? 'list (car t2)) - (match1 (second t1) (second t2)) - (match1 (third t1) t2))) - ((and (pair? t2) (eq? 'pair (car t2))) - (and (pair? t1) - (eq? 'list (car t1)) - (match1 (second t1) (second t2)) - (match1 t1 (third t2)))) - ((and (pair? t1) (eq? 'list (car t1))) - (or (eq? 'null t2) - (and (pair? t2) - (eq? 'pair? (car t2)) - (match1 (second t1) (second t2)) - (match1 t1 (third t2))))) - ((and (pair? t2) (eq? 'list (car t2))) - (or (eq? 'null t1) - (and (pair? t1) - (eq? 'pair? (car t1)) - (match1 (second t1) (second t2)) - (match1 (third t1) t2)))) - (else #f))) - (let ((m (match1 t1 t2))) - (dd " match ~a <-> ~a -> ~a" t1 t2 m) - m)) - - (define (match-args args1 args2 typeenv) - (d "match-args: ~s <-> ~s" args1 args2) - (define (match-rest rtype args opt) ;XXX currently ignores `opt' - (let-values (((head tail) (break (cut eq? '#!rest <>) args))) - (and (every (cut match rtype <> typeenv) head) ; match required args - (match rtype (if (pair? tail) (rest-type (cdr tail)) '*) typeenv)))) - (define (optargs a) - (memq a '(#!rest #!optional))) - (let loop ((args1 args1) (args2 args2) (opt1 #f) (opt2 #f)) - (dd " args ~a ~a ~a ~a" args1 args2 opt1 opt2) - (cond ((null? args1) - (or opt2 - (null? args2) - (optargs (car args2)))) - ((null? args2) - (or opt1 - (optargs (car args1)))) - ((eq? '#!optional (car args1)) - (loop (cdr args1) args2 #t opt2)) - ((eq? '#!optional (car args2)) - (loop args1 (cdr args2) opt1 #t)) - ((eq? '#!rest (car args1)) - (match-rest (rest-type (cdr args1)) args2 opt2)) - ((eq? '#!rest (car args2)) - (match-rest (rest-type (cdr args2)) args1 opt1)) - ((match (car args1) (car args2) typeenv) - (loop (cdr args1) (cdr args2) opt1 opt2)) - (else #f)))) - - (define (match-results results1 results2 typeenv) - (cond ((null? results1) (atom? results2)) - ((eq? '* results1)) - ((eq? '* results2)) - ((null? results2) #f) - ((match (car results1) (car results2) typeenv) - (match-results (cdr results1) (cdr results2) typeenv)) - (else #f))) - (define (multiples n) (if (= n 1) "" "s")) @@ -485,11 +354,7 @@ (xptype `(procedure ,(make-list nargs '*) *)) (typeenv (or (and pptype? (type-typeenv ptype)) '())) (op #f)) - (define (resolve t) - (cond ((not t) '*) - ((assq t typeenv) => (lambda (a) (resolve (cdr a)))) - (else t))) - (cond ((and (not pptype?) (not (match xptype ptype typeenv))) + (cond ((and (not pptype?) (not (match-types xptype ptype typeenv))) (report loc (sprintf @@ -514,7 +379,7 @@ (atypes atypes (cdr atypes)) (i 1 (add1 i))) ((or (null? args) (null? atypes))) - (unless (match (car atypes) (car args) typeenv) + (unless (match-types (car atypes) (car args) typeenv) (report loc (sprintf @@ -524,12 +389,13 @@ (set! noreturn #t)) (let ((r (procedure-result-types ptype values-rest (cdr args) typeenv))) ;;XXX we should check whether this is a standard- or extended binding - (let* ((pn (procedure-name ptype))) + (let* ((pn (procedure-name ptype)) + (trail0 trail)) (when pn (cond ((and (fx= 1 nargs) (variable-mark pn '##compiler#predicate)) => (lambda (pt) - (cond ((match-specialization + (cond ((match-argument-types (list pt) (cdr args) typeenv #t) (report-notice loc @@ -541,8 +407,11 @@ node `(let ((#(tmp) #(1))) '#t)) (set! op (list pn pt)))) - ((match-specialization - (list `(not ,pt)) (cdr args) typeenv #t) + ((begin + (trail-restore trail0 typeenv) + (match-argument-types + (list `(not ,pt)) (cdr args) typeenv + #t)) (report-notice loc (sprintf @@ -552,26 +421,27 @@ (specialize-node! node `(let ((#(tmp) #(1))) '#f)) - (set! op (list pt `(not ,pt)))))))) + (set! op (list pt `(not ,pt))))) + (else (trail-restore trail0 typeenv))))) ((and specialize (get-specializations pn)) => (lambda (specs) - (let ((trail0 trail)) - (let loop ((specs specs)) - (cond ((null? specs)) - ((match-specialization - (first (car specs)) (cdr args) typeenv #f) - (let ((spec (car specs))) - (set! op (cons pn (car spec))) - (let* ((r2 (and (pair? (cddr spec)) - (second spec))) - (rewrite (if r2 - (third spec) - (second spec)))) - (specialize-node! node rewrite) - (when r2 (set! r r2))))) - (else - (trail-restore trail0 typeenv) - (loop (cdr specs))))))))) + (let loop ((specs specs)) + (cond ((null? specs)) + ((match-argument-types + (first (car specs)) (cdr args) typeenv + #t) + (let ((spec (car specs))) + (set! op (cons pn (car spec))) + (let* ((r2 (and (pair? (cddr spec)) + (second spec))) + (rewrite (if r2 + (third spec) + (second spec)))) + (specialize-node! node rewrite) + (when r2 (set! r r2))))) + (else + (trail-restore trail0 typeenv) + (loop (cdr specs)))))))) (when op (d " specialized: `~s'" op) (cond ((assoc op specialization-statistics) => @@ -583,7 +453,7 @@ (when (and specialize (not op) (procedure-type? ptype)) (set-car! (node-parameters node) #t) (set! safe-calls (add1 safe-calls)))) - (let ((r (if (eq? '* r) r (map resolve r)))) + (let ((r (if (eq? '* r) r (map (cut resolve <> typeenv) r)))) (d " result-types: ~a" r) (values r op)))))))) @@ -613,6 +483,16 @@ (d " applying to alias: ~a -> ~a" (cdr a) type) (loop (cdr a)))))) + (define (initial-argument-types dest vars argc) + (if (and dest + strict-variable-types + (variable-mark dest '##compiler#declared-type)) + (let ((ptype (variable-mark dest '##compiler#type))) + (if (procedure-type? ptype) + (nth-value 0 (procedure-argument-types ptype argc '() #t)) + (make-list argc '*))) + (make-list argc '*))) + (define (walk n e loc dest tail flow ctags) ; returns result specifier (let ((subs (node-subexpressions n)) (params (node-parameters n)) @@ -675,8 +555,11 @@ (sprintf "branches in conditional expression differ in the number of results:~%~%~a" (pp-fragment n)))) - (map (lambda (t1 t2) (simplify-type `(or ,t1 ,t2))) - r1 r2)) + (cond (nor1 r2) + (nor2 r1) + (else + (map (lambda (t1 t2) (simplify-type `(or ,t1 ,t2))) + r1 r2)))) (else '*)))))) ((let) ;; before CPS-conversion, `let'-nodes may have multiple bindings @@ -748,7 +631,7 @@ (b (assq var e)) ) (when (and type (not b) (not (eq? type 'deprecated)) - (not (match type rt '()))) + (not (match-types type rt '()))) ;;XXX make this an error with strict-types? (report loc @@ -808,24 +691,20 @@ (enforces (and pn (variable-mark pn '##compiler#enforce))) (pt (and pn (variable-mark pn '##compiler#predicate)))) - (define (resolve t) - (cond ((not t) '*) - ((assq t typeenv) => (lambda (a) (resolve (cdr a)))) - (else t))) (let-values (((r specialized?) (call-result n args e loc params typeenv))) (cond (specialized? (walk n e loc dest tail flow ctags) ;; keep type, as the specialization may contain icky stuff ;; like "##core#inline", etc. - (resolve r)) + (resolve r typeenv)) (else (for-each (lambda (arg argr) (when (eq? '##core#variable (node-class arg)) (let* ((var (first (node-parameters arg))) (a (assq var e)) - (argr (resolve argr)) + (argr (resolve argr typeenv)) (oparg? (eq? arg (first subs))) (pred (and pt ctags @@ -836,7 +715,7 @@ ;; branch by subtracting pt from the current type ;; of var, at least in the simple case of ;; "(or ... <PT> ...)" -> "(or ... ...)" - (let ((pt (resolve pt))) + (let ((pt (resolve pt typeenv))) (d " predicate `~a' indicates `~a' is ~a in flow ~a" pn var pt (car ctags)) (add-to-blist @@ -897,12 +776,13 @@ (first rt) t))))) (list t)))) ((##core#typecase) - (let ((ts (walk (first subs) e loc #f #f flow ctags))) + (let ((ts (walk (first subs) e loc #f #f flow ctags)) + (trail0 trail)) ;; first exp is always a variable so ts must be of length 1 (let loop ((types params) (subs (cdr subs))) (cond ((null? types) (bomb "no clause applies in `compiler-typecase'" params (car ts))) - ((match-specialization (list (car types)) ts '() #f) + ((match-types (car types) (car ts) '()) ;; drops exp (copy-node! (car subs) n) (walk n e loc dest tail flow ctags)) @@ -931,6 +811,177 @@ rn))) +;;; Type-matching +; +; - "exact" means: first argument must match second one exactly + +(define (match-types t1 t2 typeenv #!optional exact) + + (define (match-args args1 args2) + (d "match-args: ~s <-> ~s" args1 args2) + (let loop ((args1 args1) (args2 args2) (opt1 #f) (opt2 #f)) + (dd " args ~a ~a ~a ~a" args1 args2 opt1 opt2) + (cond ((null? args1) + (or opt2 + (null? args2) + (optargs? (car args2)))) + ((null? args2) + (or opt1 + (optargs? (car args1)))) + ((eq? '#!optional (car args1)) + (loop (cdr args1) args2 #t opt2)) + ((eq? '#!optional (car args2)) + (loop args1 (cdr args2) opt1 #t)) + ((eq? '#!rest (car args1)) + (match-rest (rest-type (cdr args1)) args2 opt2)) + ((eq? '#!rest (car args2)) + (match-rest (rest-type (cdr args2)) args1 opt1)) + ((match1 (car args1) (car args2)) + (loop (cdr args1) (cdr args2) opt1 opt2)) + (else #f)))) + + (define (match-rest rtype args opt) ;XXX currently ignores `opt' + (let-values (((head tail) (break (cut eq? '#!rest <>) args))) + (and (every (cut match1 rtype <>) head) ; match required args + (match1 rtype (if (pair? tail) (rest-type (cdr tail)) '*))))) + + (define (optargs? a) + (memq a '(#!rest #!optional))) + + (define (match-results results1 results2) + (cond ((null? results1) (atom? results2)) + ((eq? '* results1)) + ((eq? '* results2)) + ((null? results2) #f) + ((match1 (car results1) (car results2)) + (match-results (cdr results1) (cdr results2))) + (else #f))) + + (define (match1 t1 t2) + (cond ((eq? t1 t2)) + ((and (symbol? t1) (assq t1 typeenv)) => + (lambda (e) + (if (cdr e) + (match1 (cdr e) t2) + (begin + (dd " unify ~a = ~a" t1 t2) + (set! trail (cons t1 trail)) + (set-cdr! e t2) + #t)))) + ((and (symbol? t2) (assq t2 typeenv)) => + (lambda (e) + (if (cdr e) + (match1 t1 (cdr e)) + (begin + (dd " unify ~a = ~a" t2 t1) + (set! trail (cons t2 trail)) + (set-cdr! e t1) + #t)))) + ((eq? t1 '*)) + ((eq? t2 '*) (not exact)) + ((eq? t1 'noreturn) (not exact)) + ((eq? t2 'noreturn) (not exact)) + ((eq? t1 'number) + (and (not exact) + (match1 '(or fixnum float) t2))) + ((eq? t2 'number) + (and (not exact) + (match1 t1 '(or fixnum float)))) + ((eq? 'procedure t1) + (and (pair? t2) + (eq? 'procedure (car t2)))) + ((eq? 'procedure t2) + (and (not exact) + (pair? t1) + (eq? 'procedure (car t1)))) + ((and (pair? t1) (eq? 'not (car t1))) + (let* ((trail0 trail) + (m (match1 (cadr t1) t2))) + (trail-restore trail0 typeenv) + (not m))) + ((and (pair? t2) (eq? 'not (car t2))) + (and (not exact) + (let* ((trail0 trail) + (m (match1 t1 (cadr t2)))) + (trail-restore trail0 typeenv) + (not m)))) + ((and (pair? t1) (eq? 'or (car t1))) + (any (cut match1 <> t2) (cdr t1))) + ((and (pair? t2) (eq? 'or (car t2))) + ((if exact every any) (cut match1 t1 <>) (cdr t2))) + ((and (pair? t1) (eq? 'forall (car t1))) + (match1 (third t1) t2)) ; assumes typeenv has already been extracted + ((and (pair? t2) (eq? 'forall (car t2))) + (match1 t1 (third t2))) ; assumes typeenv has already been extracted + ((eq? t1 'pair) (match1 '(pair * *) t2)) + ((eq? t2 'pair) (match1 t1 '(pair * *))) + ((eq? t1 'list) (match1 '(list *) t2)) + ((eq? t2 'list) (match1 t1 '(list *))) + ((eq? t1 'vector) (match1 '(vector *) t2)) + ((eq? t2 'vector) (match1 t1 '(vector *))) + ((eq? t1 'null) + (and (not exact) + (or (memq t2 '(null list)) + (and (pair? t2) (eq? 'list (car t2)))))) + ((eq? t2 'null) + (and (not exact) + (or (memq t1 '(null list)) + (and (pair? t1) (eq? 'list (car t1)))))) + ((and (pair? t1) (pair? t2) (eq? (car t1) (car t2))) + (case (car t1) + ((procedure) + (let ((args1 (if (named? t1) (third t1) (second t1))) + (args2 (if (named? t2) (third t2) (second t2))) + (results1 (if (named? t1) (cdddr t1) (cddr t1))) + (results2 (if (named? t2) (cdddr t2) (cddr t2))) ) + (and (match-args args1 args2) + (match-results results1 results2)))) + ((struct) (equal? t1 t2)) + ((pair) (every match1 (cdr t1) (cdr t2))) + ((list vector) (match1 (second t1) (second t2))) + (else #f) ) ) + ((and (pair? t1) (eq? 'pair (car t1))) + (and (not exact) + (pair? t2) + (eq? 'list (car t2)) + (match1 (second t1) (second t2)) + (match1 (third t1) t2))) + ((and (pair? t2) (eq? 'pair (car t2))) + (and (not exact) + (pair? t1) + (eq? 'list (car t1)) + (match1 (second t1) (second t2)) + (match1 t1 (third t2)))) + ((and (pair? t1) (eq? 'list (car t1))) + (and (not exact) + (or (eq? 'null t2) + (and (pair? t2) + (eq? 'pair? (car t2)) + (match1 (second t1) (second t2)) + (match1 t1 (third t2)))))) + ((and (pair? t2) (eq? 'list (car t2))) + (and (not exact) + (or (eq? 'null t1) + (and (pair? t1) + (eq? 'pair? (car t1)) + (match1 (second t1) (second t2)) + (match1 (third t1) t2))))) + (else #f))) + (let ((m (match1 t1 t2))) + (dd " match ~a <-> ~a -> ~a" t1 t2 m) + m)) + +(define (match-argument-types typelist atypes typeenv #!optional exact) + (let loop ((tl typelist) (atypes atypes)) + (cond ((null? tl) (null? atypes)) + ((null? atypes) #f) + ((eq? (car tl) '#!rest) + (every (cute match-types (cadr tl) <> typeenv exact) atypes)) + ((match-types (car tl) (car atypes) typeenv exact) + (loop (cdr tl) (cdr atypes))) + (else #f)))) + + ;;; Simplify type specifier ; ; - coalesces "forall" and renames type-variables @@ -1060,8 +1111,8 @@ (call/cc (lambda (return) (let loop ((ts1 ts11) (ts2 ts21)) - (cond ((null? ts1) ts2) - ((null? ts2) ts1) + (cond ((null? ts1) '()) + ((null? ts2) '()) ((or (atom? ts1) (atom? ts2)) (return '*)) ((eq? 'noreturn (car ts1)) (loop (cdr ts1) ts2)) ((eq? 'noreturn (car ts2)) (loop ts1 (cdr ts2))) @@ -1286,6 +1337,9 @@ ((forall) (noreturn-type? (third t))) (else #f))))) + +;;; Type-environments and -variables + (define (type-typeenv t) (let ((te '())) (let loop ((t t)) @@ -1313,6 +1367,33 @@ (let ((a (assq (car tr2) typeenv))) (set-cdr! a #f)))) +(define (resolve t typeenv) + (let resolve ((t t)) + (cond ((not t) '*) ; unbound type-variable + ((assq t typeenv) => (lambda (a) (resolve (cdr a)))) + ((not (pair? t)) t) + (else + (case (car t) + ((or) `(or ,@(map resolve (cdr t)))) + ((not) `(not ,(resolve (second t)))) + ((forall) `(forall ,(second t) ,(resolve (third t)))) + ((pair list vector) + (cons (car t) (map resolve (cdr t)))) + ((procedure) + (let* ((n (named? t)) + (argtypes ((if n third second) t)) + (rtypes ((if n cdddr cddr) t))) + `(procedure + ,(let loop ((args argtypes)) + (cond ((null? args) '()) + ((eq? '#!rest (car args)) + (cons '#!rest (loop (cdr args)))) + (else (cons (resolve (car args)) (loop (cdr args)))))) + ,@(if (eq? '* rtypes) + '* + (map resolve rtypes))))) + (else t)))))) + ;;; type-db processing @@ -1366,166 +1447,34 @@ source-filename "\n") (##sys#hash-table-for-each (lambda (sym plist) - (when (variable-visible? sym) - (when (variable-mark sym '##compiler#declared-type) - (let ((specs (or (variable-mark sym '##compiler#specializations) '())) - (type (variable-mark sym '##compiler#type)) - (pred (variable-mark sym '##compiler#predicate)) - (enforce (variable-mark sym '##compiler#enforce))) - (pp (cons* - sym - (if (and (pair? type) (eq? 'procedure (car type))) - `(,(cond ((and enforce pred) 'procedure!?) - (pred 'procedure?) - (enforce 'procedure!) - (else 'procedure)) - ,@(if pred (list pred) '()) - ,@(cdr type)) - type) - specs)))))) + (when (and (variable-visible? sym) + (variable-mark sym '##compiler#declared-type)) + (let ((specs (or (variable-mark sym '##compiler#specializations) '())) + (type (variable-mark sym '##compiler#type)) + (pred (variable-mark sym '##compiler#predicate)) + (enforce (variable-mark sym '##compiler#enforce))) + (pp (cons* + sym + (let wrap ((type type)) + (if (pair? type) + (case (car type) + ((procedure) + `(,(cond ((and enforce pred) 'procedure!?) + (pred 'procedure?) + (enforce 'procedure!) + (else 'procedure)) + ,@(if pred (list pred) '()) + ,@(cdr type))) + ((forall) + `(forall ,(second type) ,(wrap (third type)))) + (else type)) + type)) + specs))))) db) (print "; END OF FILE")))) -;;; matching for specialization - -(define (match-specialization typelist atypes typeenv exact) - ;; - does not accept complex procedure types in typelist! - ;; - "exact" means: "or"-type in atypes is not allowed (used for predicates) - ;; - ;;XXX It is not entirely clear to me whether we can simply use the "match" - ;; above instead of having a second matcher. The only difference - ;; seems to be the specialization-types allow "not" and disallow - ;; complex procedure types (the latter would be handled by the - ;; full matcher). And what about "exact"? - ;; - (define (match st t) - (cond ((eq? st t)) - ((and (symbol? st) (assq st typeenv)) => - (lambda (e) - (if (cdr e) - (match (cdr e) t) - (begin - (d " unify (specialization) ~a = ~a" st t) - (set-cdr! e t) - #t)))) - ((and (symbol? t) (assq t typeenv)) => - (lambda (e) - (if (cdr e) - (match st (cdr e)) - (begin - (d " unify (specialization) ~a = ~a" t st) - (set-cdr! e st) - #t)))) - ((memq st '(vector list)) - (match (list st '*) t)) - ((memq t '(vector list)) - (match st (list t '*))) - ((eq? 'pair st) - (match '(pair * *) t)) - ((eq? 'pair t) - (match st '(pair * *))) - ((and (pair? t) (eq? 'or (car t))) - ((if exact every any) (cut match st <>) (cdr t))) - ((and (pair? t) (eq? 'and (car t))) - (every (cut match st <>) (cdr t))) - ((and (pair? t) (eq? 'forall (car t))) - (match st (third t))) ; assumes typeenv has already been extracted - ((and (pair? t) (eq? 'procedure (car t))) - (match st 'procedure)) - ((pair? st) - (case (car st) - ((forall) - (match (third st) t)) ; assumes typeenv has already been extracted - ((not) (matchnot (cadr st) t)) - ((or) (any (cut match <> t) (cdr st))) - ((and) (every (cut match <> t) (cdr st))) - ((list) - (or (eq? 'null t) - (and (pair? t) - (eq? 'list (car t)) - (match (second st) (second t))))) - ((vector) - (and (pair? t) - (eq? 'vector (car t)) - (match (second st) (second t)))) - ((pair) - (and (pair? t) - (eq? 'pair (car t)) - (match (second st) (second t)) - (match (third st) (third t)))) - ((procedure) - (bomb "match-specialization: can not match complex procedure type" st)) - (else (equal? st t)))) - ((eq? st '*)) - ;; "list" different from "number": a pair is not necessarily a list: - ((eq? st 'number) (match '(or fixnum float) t)) - (else (equal? st t)))) - (define (matchnot st t) - (cond ((eq? st t) #f) - ((and (symbol? st) (assq st typeenv)) => ; doesn't unify - (lambda (e) - (if (cdr e) - (matchnot (cdr e) t) - #f))) - ((and (symbol? t) (assq t typeenv)) => - (lambda (e) - (if (cdr e) - (matchnot st (cdr e)) - #f))) - ((memq st '(vector list)) - (matchnot (list st '*) t)) - ((memq t '(vector list)) - (matchnot st (list t '*))) - ((eq? 'pair st) - (matchnot '(pair * *) t)) - ((eq? 'pair t) - (matchnot st '(pair * *))) - ((and (pair? t) (eq? 'or (car t))) - (every (cut matchnot st <>) (cdr t))) - ((and (pair? t) (eq? 'and (car t))) - (any (cut matchnot st <>) (cdr t))) ;XXX test for "exact" here, too? - ((eq? 'number st) (not (match '(or fixnum float) t))) - ((eq? 'number t) (matchnot st '(or fixnum float))) - ((eq? '* t) #f) - ((eq? 'null st) - (or (not (pair? t)) - (not (eq? 'list (car t))))) - ((and (pair? t) (eq? 'forall (car t))) - (match st (third t))) ; assumes typeenv has already been extracted - ((pair? st) - (case (car st) - ;;XXX "and" not handled here - ((forall) - (match (third st) t)) ; assumes typeenv has already been extracted - ((or) (every (cut matchnot <> t) (cdr t))) - ((list) - (and (not (eq? 'null t)) - (or (not (pair? t)) - (and (eq? 'list (car t)) - (matchnot (second st) (second t))) - (matchnot `(pair ,(second st) *) t)))) ;XXX too conservative? - ((vector) - (or (not (pair? t)) - (not (eq? 'vector (car t))) - (matchnot (second st) (second t)))) - ((pair) - (or (not (pair? t)) - (case (car t) - ((list) (matchnot (second st) (second t))) - ((pair) - (and (matchnot (second st) (second t)) - (matchnot (third st) (third t)))) - (else #f)))) - (else (not (match st t))))) - (else (not (match st t))))) - (let loop ((tl typelist) (atypes atypes)) - (cond ((null? tl) (null? atypes)) - ((null? atypes) #f) - ((eq? (car tl) '#!rest) - (every (cute match (cadr tl) <>) atypes)) - ((match (car tl) (car atypes)) (loop (cdr tl) (cdr atypes))) - (else #f)))) +;; Mutate node for specialization (define (specialize-node! node template) (let ((args (cdr (node-subexpressions node))) @@ -1555,6 +1504,9 @@ (let ((spec (subst template))) (copy-node! (build-node-graph spec) node)))) + +;;; Type-validation and -normalization + (define (validate-type type name) ;; - returns converted type or #f ;; - also converts "(... -> ...)" types @@ -1672,16 +1624,6 @@ (let ((type (simplify-type type))) (values type (and ptype (eq? (car ptype) type) (cdr ptype))))))) -(define (initial-argument-types dest vars argc) - (if (and dest - strict-variable-types - (variable-mark dest '##compiler#declared-type)) - (let ((ptype (variable-mark dest '##compiler#type))) - (if (procedure-type? ptype) - (nth-value 0 (procedure-argument-types ptype argc '() #t)) - (make-list argc '*))) - (make-list argc '*))) - ;;; hardcoded result types for certain primitives diff --git a/types.db.new b/types.db.new new file mode 100644 index 00000000..e3a0f72e --- /dev/null +++ b/types.db.new @@ -0,0 +1,2198 @@ +;;;; types.db - Type-information for core library functions -*- Scheme -*- +; +; Copyright (c)2009-2011, The Chicken Team +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following +; conditions are met: +; +; Redistributions of source code must retain the above copyright notice, this list of conditions and the following +; disclaimer. +; Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +; disclaimer in the documentation and/or other materials provided with the distribution. +; Neither the name of the author nor the names of its contributors may be used to endorse or promote +; products derived from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS +; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR +; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +; OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +; POSSIBILITY OF SUCH DAMAGE. + + +;;; Notes: +; +; - numeric types are disjoint, "fixnum" or "float" will not match "number" in the +; rewrite rules +; - for a description of the type-specifier syntax, see "scrutinizer.scm" (top of file) +; - in templates, "#(INTEGER)" refers to the INTEGERth argument (starting from 1) +; - in templates, "#(INTEGER ...)" refers to the INTEGERth argument (starting from 1) and +; all remaining arguments +; - in templates "#(SYMBOL)" binds X to a temporary gensym'd variable, further references +; to "#(SYMBOL)" allow backreferences to this generated identifier +; - a type of the form "(procedure! ...)" is internally treated like "(procedure ..." +; but declares the procedure as "argument-type enforcing" +; - a type of the form "(procedure? TYPE ...)" is internally treated like "(procedure ..." +; but declares the procedure as a predicate over TYPE. +; - a type of the form "(procedure!? TYPE ...)" or "(procedure?! TYPE ...)" is the obvious. +; - types in specializations are currently not validated + + +;; scheme + +(not (procedure not (*) boolean) + (((not boolean)) (let ((#(tmp) #(1))) '#t))) + +(boolean? (procedure? boolean boolean? (*) boolean)) + +(eq? (procedure eq? (* *) boolean)) + +(eqv? (procedure eqv? (* *) boolean) + (((not float) *) (eq? #(1) #(2))) + ((* (not float)) (eq? #(1) #(2)))) + +(equal? (procedure equal? (* *) boolean) + (((or fixnum symbol char eof null undefined) *) (eq? #(1) #(2))) + ((* (or fixnum symbol char eof null undefined) (eq? #(1) #(2))))) + +(pair? (procedure? pair pair? (*) boolean)) + +(cons (forall (a b) (procedure cons (a b) (pair a b)))) + +(##sys#cons (forall (a b) (procedure ##sys#cons (a b) (pair a b)))) + +(car (forall (a) (procedure! car ((pair a *)) a) ((pair) (##core#inline "C_u_i_car" #(1))))) +(cdr (forall (a) (procedure! cdr ((pair * a)) a) ((pair) (##core#inline "C_u_i_cdr" #(1))))) + +(caar (forall (a) (procedure! caar ((pair (pair a *) *)) a))) + +(cadr (forall (a) (procedure! cadr ((pair * (pair a *))) a))) +(cdar (forall (a) (procedure! cdar ((pair (pair * a) *)) a))) +(cddr (forall (a) (procedure! cddr ((pair * (pair * a))) a))) +(caaar (forall (a) (procedure! caaar ((pair (pair (pair a *) *) *)) a))) +(caadr (forall (a) (procedure! caadr ((pair * (pair (pair a *) *))) a))) +(cadar (forall (a) (procedure! cadar ((pair (pair * (pair a *)) *)) a))) +(caddr (forall (a) (procedure! caddr ((pair * (pair * (pair a *)))) a))) +(cdaar (forall (a) (procedure! cdaar ((pair (pair (pair * a) *) *)) a))) +(cdadr (forall (a) (procedure! cdadr ((pair * (pair (pair * a) *))) a))) +(cddar (forall (a) (procedure! cddar ((pair (pair * (pair * a)) *)) a))) +(cdddr (forall (a) (procedure! cdddr ((pair * (pair * (pair * a)))) a))) +(caaaar (forall (a) (procedure! caaaar ((pair (pair (pair (pair a *) *) *) *)) a))) +(caaadr (forall (a) (procedure! caaadr ((pair * (pair (pair (pair a *) *) *))) a))) +(caadar (forall (a) (procedure! caadar ((pair (pair * (pair (pair a *) *)) *)) a))) +(caaddr (forall (a) (procedure! caaddr ((pair * (pair * (pair (pair a *) *)))) a))) +(cadaar (forall (a) (procedure! cadaar ((pair (pair (pair * (pair a *)) *) *)) a))) +(cadadr (forall (a) (procedure! cadadr ((pair * (pair (pair * (pair a *)) *))) a))) +(caddar (forall (a) (procedure! caddar ((pair (pair * (pair * (pair a *))) *)) a))) +(cadddr (forall (a) (procedure! cadddr ((pair * (pair * (pair * (pair a *))))) a))) +(cdaaar (forall (a) (procedure! cdaaar ((pair (pair (pair (pair * a) *) *) *)) a))) +(cdaadr (forall (a) (procedure! cdaadr ((pair * (pair (pair (pair * a) *) *))) a))) +(cdadar (forall (a) (procedure! cdadar ((pair (pair * (pair (pair * a) *)) *)) a))) +(cdaddr (forall (a) (procedure! cdaddr ((pair * (pair * (pair (pair * a) *)))) a))) +(cddaar (forall (a) (procedure! cddaar ((pair (pair (pair * (pair * a)) *) *)) a))) +(cddadr (forall (a) (procedure! cddadr ((pair * (pair (pair * (pair * a)) *))) a))) +(cdddar (forall (a) (procedure! cdddar ((pair (pair * (pair * (pair * a))) *)) a))) +(cddddr (forall (a) (procedure! cddddr ((pair * (pair * (pair * (pair * a))))) a))) + +(set-car! (procedure! set-car! (pair *) undefined) + ((pair (or fixnum char boolean eof null undefined)) (##sys#setislot #(1) '0 #(2))) + ((pair *) (##sys#setslot #(1) '0 #(2)))) + +(set-cdr! (procedure! set-cdr! (pair *) undefined) + ((pair (or fixnum char boolean eof null undefined)) (##sys#setislot #(1) '1 #(2))) + ((pair *) (##sys#setslot #(1) '1 #(2)))) + +(null? (procedure? null null? (*) boolean)) +(list? (procedure? list list? (*) boolean)) + +(list (procedure list (#!rest) list)) +(##sys#list (procedure ##sys#list (#!rest) list)) +(length (procedure! length (list) fixnum) ((list) (##core#inline "C_u_i_length" #(1)))) +(##sys#length (procedure! ##sys#length (list) fixnum) ((list) (##core#inline "C_u_i_length" #(1)))) +(list-tail (forall (a) (procedure! list-tail ((list a) fixnum) (list a)))) +(list-ref (forall (a) (procedure! list-ref ((list a) fixnum) a))) +(append (procedure append (list #!rest) *)) +(##sys#append (procedure ##sys#append (list #!rest) *)) +(reverse (forall (a) (procedure! reverse ((list a)) (list a)))) +(memq (procedure memq (* list) *) ((* list) (##core#inline "C_u_i_memq" #(1) #(2)))) + +(memv (procedure memv (* list) *) + (((or fixnum boolean char eof undefined null) list) + (##core#inline "C_u_i_memq" #(1) #(2)))) + +;; this may be a bit much... +(member (forall (a) (procedure member (* list #!optional (procedure (* *) *)) *)) + (((or fixnum boolean char eof undefined null) list) + (##core#inline "C_u_i_memq" #(1) #(2))) + ((* (list (or fixnum boolean char eof undefined null))) + (##core#inline "C_u_i_memq" #(1) #(2)))) + +(assq (procedure assq (* list) *) ((* list) (##core#inline "C_u_i_assq" #(1) #(2)))) + +(assv (procedure assv (* list) *) + (((or fixnum boolean char eof undefined null) list) + (##core#inline "C_u_i_assq" #(1) #(2))) + ((* (list (or fixnum boolean char eof undefined null))) + (##core#inline "C_u_i_assq" #(1) #(2)))) + +(assoc (procedure assoc (* list #!optional (procedure (* *) *)) *) + (((or fixnum boolean char eof undefined null) list) + (##core#inline "C_u_i_assq" #(1) #(2))) + ((* (list (or fixnum boolean char eof undefined null))) + (##core#inline "C_u_i_assq" #(1) #(2)))) + +(symbol? (procedure? symbol symbol? (*) boolean)) + +(symbol-append (procedure! symbol-append (#!rest symbol) symbol)) +(symbol->string (procedure! symbol->string (symbol) string)) +(string->symbol (procedure! string->symbol (string) symbol)) + +(number? (procedure? number number? (*) boolean)) + +;;XXX predicate? +(integer? (procedure integer? (*) boolean) + ((fixnum) (let ((#(tmp) #(1))) '#t)) + ((float) (##core#inline "C_u_i_fpintegerp" #(1)))) + +(exact? (procedure? fixnum exact? (*) boolean)) +(real? (procedure? number real? (*) boolean)) +(complex? (procedure? number complex? (*) boolean)) +(inexact? (procedure? float inexact? (*) boolean)) + +;;XXX predicate? +(rational? (procedure rational? (*) boolean) + ((fixnum) (let ((#(tmp) #(1))) '#t))) + +(zero? (procedure! zero? (number) boolean) + ((fixnum) (eq? #(1) '0)) + ((number) (##core#inline "C_u_i_zerop" #(1)))) + +(odd? (procedure! odd? (number) boolean) ((fixnum) (fxodd? #(1)))) +(even? (procedure! even? (number) boolean) ((fixnum) (fxeven? #(1)))) + +(positive? (procedure! positive? (number) boolean) + ((fixnum) (##core#inline "C_fixnum_greaterp" #(1) '0)) + ((number) (##core#inline "C_u_i_positivep" #(1)))) + +(negative? (procedure! negative? (number) boolean) + ((fixnum) (##core#inline "C_fixnum_lessp" #(1) '0)) + ((number) (##core#inline "C_u_i_negativep" #(1)))) + +(max (procedure! max (#!rest number) number) + ((fixnum fixnum) (fxmax #(1) #(2))) + ((float float) (##core#inline "C_i_flonum_max" #(1) #(2)))) + +(min (procedure! min (#!rest number) number) + ((fixnum fixnum) (fxmin #(1) #(2))) + ((float float) (##core#inline "C_i_flonum_min" #(1) #(2)))) + +(+ (procedure! + (#!rest number) number) + ((fixnum) (fixnum) #(1)) + ((float) (float) #(1)) + ((number) #(1)) + ((float fixnum) (float) + (##core#inline_allocate + ("C_a_i_flonum_plus" 4) + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) + (float) + (##core#inline_allocate + ("C_a_i_flonum_plus" 4) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (float) + (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) #(2)))) + +(- (procedure! - (number #!rest number) number) + ((fixnum) (fixnum) + (##core#inline "C_u_fixnum_negate" #(1))) + ((float fixnum) (float) + (##core#inline_allocate + ("C_a_i_flonum_difference" 4) + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) (float) + (##core#inline_allocate + ("C_a_i_flonum_difference" 4) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (float) + (##core#inline_allocate ("C_a_i_flonum_difference" 4) #(1) #(2))) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_negate" 4) #(1)))) + +(* (procedure! * (#!rest number) number) + ((fixnum) (fixnum) #(1)) + ((float) (float) #(1)) + ((number) (number) #(1)) + ((float fixnum) (float) + (##core#inline_allocate + ("C_a_i_flonum_times" 4) + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) (float) + (##core#inline_allocate + ("C_a_i_flonum_times" 4) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (float) + (##core#inline_allocate ("C_a_i_flonum_times" 4) #(1) #(2)))) + +(/ (procedure! / (number #!rest number) number) + ((float fixnum) (float) + (##core#inline_allocate + ("C_a_i_flonum_quotient_checked" 4) + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) (float) + (##core#inline_allocate + ("C_a_i_flonum_quotient_checked" 4) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (float) + (##core#inline_allocate ("C_a_i_flonum_quotient_checked" 4) #(1) #(2)))) + +(= (procedure! = (#!rest number) boolean) + ((fixnum fixnum) (eq? #(1) #(2))) + ((float fixnum) (##core#inline + "C_flonum_equalp" + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) (##core#inline + "C_flonum_equalp" + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (##core#inline "C_flonum_equalp" #(1) #(2)))) + +(> (procedure! > (#!rest number) boolean) + ((fixnum fixnum) (fx> #(1) #(2))) + ((float fixnum) (##core#inline + "C_flonum_greaterp" + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) (##core#inline + "C_flonum_greaterp" + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (##core#inline "C_flonum_greaterp" #(1) #(2)))) + +(< (procedure! < (#!rest number) boolean) + ((fixnum fixnum) (fx< #(1) #(2))) + ((float fixnum) (##core#inline + "C_flonum_lessp" + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) (##core#inline + "C_flonum_lessp" + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (##core#inline "C_flonum_lessp" #(1) #(2)))) + +(>= (procedure! >= (#!rest number) boolean) + ((fixnum fixnum) (fx>= #(1) #(2))) + ((float fixnum) (##core#inline + "C_flonum_greater_or_equal_p" + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) (##core#inline + "C_flonum_greater_or_equal_p" + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (##core#inline "C_flonum_greater_or_equal_p" #(1) #(2)))) + +(<= (procedure! <= (#!rest number) boolean) + ((fixnum fixnum) (fx<= #(1) #(2))) + ((float fixnum) (##core#inline + "C_flonum_less_or_equal_p" + #(1) + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(2)))) + ((fixnum float) (##core#inline + "C_flonum_less_or_equal_p" + (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)) + #(2))) + ((float float) (##core#inline "C_flonum_less_or_equal_p" #(1) #(2)))) + +(quotient (procedure! quotient (number number) number) + ;;XXX flonum/mixed case + ((fixnum fixnum) (fixnum) + (##core#inline "C_fixnum_divide" #(1) #(2)))) + +(remainder (procedure! remainder (number number) number) + ;;XXX flonum/mixed case + ((fixnum fixnum) (fixnum) + (##core#inline "C_fixnum_modulo" #(1) #(2)))) + +(modulo (procedure! modulo (number number) number)) + +(gcd (procedure! gcd (#!rest number) number) ((* *) (##sys#gcd #(1) #(2)))) +(lcm (procedure! lcm (#!rest number) number) ((* *) (##sys#lcm #(1) #(2)))) + +(abs (procedure! abs (number) number) + ((fixnum) (fixnum) + (##core#inline "C_fixnum_abs" #(1))) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_abs" 4) #(1)))) + +(floor (procedure! floor (number) number) + ((fixnum) (fixnum) #(1)) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_floor" 4) #(1)))) + +(ceiling (procedure! ceiling (number) number) + ((fixnum) (fixnum) #(1)) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_ceiling" 4) #(1)))) + +(truncate (procedure! truncate (number) number) + ((fixnum) (fixnum) #(1)) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_truncate" 4) #(1)))) + +(round (procedure! round (number) number) + ((fixnum) (fixnum) #(1)) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_round" 4) #(1)))) + +(exact->inexact (procedure! exact->inexact (number) float) + ((float) #(1)) + ((fixnum) (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1)))) + +(inexact->exact (procedure! inexact->exact (number) fixnum) ((fixnum) #(1))) + +(exp (procedure! exp (number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_exp" 4) #(1)))) + +(log (procedure! log (number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_log" 4) #(1)))) + +(expt (procedure! expt (number number) number) + ((float float) (float) + (##core#inline_allocate ("C_a_i_flonum_expt" 4) #(1) #(2)))) + +(sqrt (procedure! sqrt (number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_sqrt" 4) #(1)))) + +(sin (procedure! sin (number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_sin" 4) #(1)))) + +(cos (procedure! cos (number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_cos" 4) #(1)))) + +(tan (procedure! tan (number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_tan" 4) #(1)))) + +(asin (procedure! asin (number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_asin" 4) #(1)))) + +(acos (procedure! acos (number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_acos" 4) #(1)))) + +(atan (procedure! atan (number #!optional number) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_atan" 4) #(1))) + ((float float) (##core#inline_allocate ("C_a_i_flonum_atan2" 4) #(1)))) + +(number->string (procedure! number->string (number #!optional number) string) + ((fixnum) (##sys#fixnum->string #(1)))) + +(string->number (procedure! string->number (string #!optional number) (or number boolean))) + +(char? (procedure? char char? (*) boolean)) + +;; we could rewrite these, but this is done by the optimizer anyway (safe) +(char=? (procedure! char=? (char char) boolean)) +(char>? (procedure! char>? (char char) boolean)) +(char<? (procedure! char<? (char char) boolean)) +(char>=? (procedure! char>=? (char char) boolean)) +(char<=? (procedure! char<=? (char char) boolean)) + +(char-ci=? (procedure! char-ci=? (char char) boolean)) +(char-ci<? (procedure! char-ci<? (char char) boolean)) +(char-ci>? (procedure! char-ci>? (char char) boolean)) +(char-ci>=? (procedure! char-ci>=? (char char) boolean)) +(char-ci<=? (procedure! char-ci<=? (char char) boolean)) +(char-alphabetic? (procedure! char-alphabetic? (char) boolean)) +(char-whitespace? (procedure! char-whitespace? (char) boolean)) +(char-numeric? (procedure! char-numeric? (char) boolean)) +(char-upper-case? (procedure! char-upper-case? (char) boolean)) +(char-lower-case? (procedure! char-lower-case? (char) boolean)) +(char-upcase (procedure! char-upcase (char) char)) +(char-downcase (procedure! char-downcase (char) char)) + +(char->integer (procedure! char->integer (char) fixnum)) +(integer->char (procedure! integer->char (fixnum) char)) + +(string? (procedure? string string? (*) boolean)) + +(string=? (procedure! string=? (string string) boolean) + ((string string) (##core#inline "C_u_i_string_equal_p" #(1) #(2)))) + +(string>? (procedure! string>? (string string) boolean)) +(string<? (procedure! string<? (string string) boolean)) +(string>=? (procedure! string>=? (string string) boolean)) +(string<=? (procedure! string<=? (string string) boolean)) +(string-ci=? (procedure! string-ci=? (string string) boolean)) +(string-ci<? (procedure! string-ci<? (string string) boolean)) +(string-ci>? (procedure! string-ci>? (string string) boolean)) +(string-ci>=? (procedure! string-ci>=? (string string) boolean)) +(string-ci<=? (procedure! string-ci<=? (string string) boolean)) + +(make-string (procedure! make-string (fixnum #!optional char) string) + ((fixnum char) (##sys#make-string #(1) #(2))) + ((fixnum) (##sys#make-string #(1) '#\space))) + +(string-length (procedure! string-length (string) fixnum) + ((string) (##sys#size #(1)))) + +(string-ref (procedure! string-ref (string fixnum) char) + ((string fixnum) (##core#inline "C_subchar" #(1) #(2)))) + +(string-set! (procedure! string-set! (string fixnum char) undefined) + ((string fixnum char) (##core#inline "C_setsubchar" #(1) #(2) #(3)))) + +(string-append (procedure! string-append (#!rest string) string) + ((string string) (##sys#string-append #(1) #(2)))) + +;(string-copy (procedure! string-copy (string) string)) - we use the more general version from srfi-13 + +;;XXX continue ... + +(string->list (procedure! string->list (string) list)) +(list->string (procedure! list->string (list) string)) +(substring (procedure! substring (string fixnum #!optional fixnum) string)) +;(string-fill! (procedure! string-fill! (string char) string)) - s.a. +(string (procedure! string (#!rest char) string)) + +(vector? (procedure? vector vector? (*) boolean)) + +(make-vector (procedure! make-vector (fixnum #!optional *) vector)) + +(vector-ref (procedure! vector-ref (vector fixnum) *)) +(##sys#vector-ref (procedure! ##sys#vector-ref (vector fixnum) *)) +(vector-set! (procedure! vector-set! (vector fixnum *) undefined)) +(vector (procedure vector (#!rest) vector)) +(##sys#vector (procedure ##sys#vector (#!rest) vector)) + +(vector-length (procedure! vector-length (vector) fixnum) + ((vector) (##sys#size #(1)))) +(##sys#vector-length (procedure! ##sys#vector-length (vector) fixnum) + ((vector) (##sys#size #(1)))) + +(vector->list (procedure! vector->list (vector) list)) +(##sys#vector->list (procedure! ##sys#vector->list (vector) list)) +(list->vector (procedure! list->vector (list) vector)) +(##sys#list->vector (procedure! ##sys#list->vector (list) vector)) +(vector-fill! (procedure! vector-fill! (vector *) vector)) + +(procedure? (procedure? procedure procedure? (*) boolean)) + +(vector-copy! (procedure! vector-copy! (vector vector #!optional fixnum) undefined)) +(map (procedure! map (procedure #!rest list) list)) +(for-each (procedure! for-each (procedure #!rest list) undefined)) +(apply (procedure! apply (procedure #!rest) . *)) +(##sys#apply (procedure! ##sys#apply (procedure #!rest) . *)) +(force (procedure force (*) *)) +(call-with-current-continuation (procedure! call-with-current-continuation (procedure) . *)) +(input-port? (procedure input-port? (*) boolean)) +(output-port? (procedure output-port? (*) boolean)) +(current-input-port (procedure! current-input-port (#!optional port) port)) +(current-output-port (procedure! current-output-port (#!optional port) port)) +(call-with-input-file (procedure call-with-input-file (string (procedure (port) . *) #!rest) . *)) +(call-with-output-file (procedure call-with-output-file (string (procedure (port) . *) #!rest) . *)) +(open-input-file (procedure! open-input-file (string #!rest symbol) port)) +(open-output-file (procedure! open-output-file (string #!rest symbol) port)) +(close-input-port (procedure! close-input-port (port) undefined)) +(close-output-port (procedure! close-output-port (port) undefined)) +(load (procedure load (string #!optional procedure) undefined)) +(read (procedure! read (#!optional port) *)) + +(eof-object? (procedure? eof eof-object? (*) boolean)) + +;;XXX if we had input/output port distinction, we could specialize these: +(read-char (procedure! read-char (#!optional port) *)) ; result (or eof char) ? +(peek-char (procedure! peek-char (#!optional port) *)) + +(write (procedure! write (* #!optional port) undefined)) +(display (procedure! display (* #!optional port) undefined)) +(write-char (procedure! write-char (char #!optional port) undefined)) +(newline (procedure! newline (#!optional port) undefined)) +(with-input-from-file (procedure! with-input-from-file (string procedure #!rest symbol) . *)) +(with-output-to-file (procedure! with-output-to-file (string procedure #!rest symbol) . *)) +(dynamic-wind (procedure! dynamic-wind (procedure procedure procedure) . *)) +(values (procedure values (#!rest values) . *)) +(##sys#values (procedure ##sys#values (#!rest values) . *)) + +(call-with-values (procedure! call-with-values ((procedure () . *) procedure) . *)) + +#;(call-with-values (procedure! call-with-values ((procedure () . *) procedure) . *) + (((procedure () *) *) (let ((#(tmp1) #(1))) + (let ((#(tmp2) #(2))) + (#(tmp2) (#(tmp1))))))) + +(##sys#call-with-values + (procedure! ##sys#call-with-values ((procedure () . *) procedure) . *)) + +#;(##sys#call-with-values + (procedure! ##sys#call-with-values ((procedure () . *) procedure) . *) + (((procedure () *) *) (let ((#(tmp1) #(1))) + (let ((#(tmp2) #(2))) + (#(tmp2) (#(tmp1))))))) + +(eval (procedure eval (* #!optional *) *)) +(char-ready? (procedure! char-ready? (#!optional port) boolean)) + +(imag-part (procedure! imag-part (number) number) + ((or fixnum float number) (let ((#(tmp) #(1))) '0))) + +(real-part (procedure! real-part (number) number) + ((or fixnum float number) #(1))) + +(magnitude (procedure! magnitude (number) number) + ((fixnum) (fixnum) + (##core#inline "C_fixnum_abs" #(1))) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_abs" 4) #(1)))) + +(numerator (procedure! numerator (number) number) + ((fixnum) (fixnum) #(1))) + +(denominator (procedure! denominator (number) number) + ((fixnum) (fixnum) (let ((#(tmp) #(1))) '1))) + +(scheme-report-environment (procedure! scheme-report-environment (#!optional fixnum) *)) +(null-environment (procedure! null-environment (#!optional fixnum) *)) +(interaction-environment (procedure interaction-environment () *)) + +(port-closed? (procedure! port-closed? (port) boolean) + ((port) (##sys#slot #(1) '8))) + +;; chicken + +(abort (procedure abort (*) noreturn)) + +(add1 (procedure! add1 (number) number) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) '1.0))) + +(argc+argv (procedure argc+argv () fixnum list)) +(argv (procedure argv () list)) +(arithmetic-shift (procedure! arithmetic-shift (number number) number)) + +(bit-set? (procedure! bit-set? (number fixnum) boolean) + ((fixnum fixnum) (##core#inline "C_u_i_bit_setp" #(1) #(2)))) + +(bitwise-and (procedure! bitwise-and (#!rest number) number) + ((fixnum fixnum) (fixnum) + (##core#inline "C_fixnum_and" #(1) #(2)))) + +(bitwise-ior (procedure! bitwise-ior (#!rest number) number) + ((fixnum fixnum) (fixnum) + (##core#inline "C_fixnum_or" #(1) #(2)))) + +(bitwise-not (procedure! bitwise-not (number) number)) + +(bitwise-xor (procedure! bitwise-xor (#!rest number) number) + ((fixnum fixnum) (fixnum) + (##core#inline "C_fixnum_xor" #(1) #(2)))) + +(blob->string (procedure! blob->string (blob) string)) + +(blob-size (procedure! blob-size (blob) fixnum) + ((blob) (##sys#size #(1)))) + +(blob? (procedure? blob blob? (*) boolean)) + +(blob=? (procedure! blob=? (blob blob) boolean)) +(breakpoint (procedure breakpoint (#!optional *) . *)) +(build-platform (procedure build-platform () symbol)) +(call/cc (procedure! call/cc (procedure) . *)) +(case-sensitive (procedure case-sensitive (#!optional *) *)) +(char-name (procedure! char-name ((or char symbol) #!optional char) *)) +(chicken-home (procedure chicken-home () string)) +(chicken-version (procedure chicken-version (#!optional *) string)) +(command-line-arguments (procedure command-line-arguments (#!optional list) list)) +(condition-predicate (procedure! condition-predicate (symbol) (procedure ((struct condition)) boolean))) +(condition-property-accessor (procedure! condition-property-accessor (symbol symbol #!optional *) (procedure ((struct condition)) *))) + +(condition? (procedure? (struct condition) condition? (*) boolean)) + +(condition->list (procedure! condition->list ((struct condition)) list)) +(continuation-capture (procedure! continuation-capture ((procedure ((struct continuation)) . *)) *)) +(continuation-graft (procedure! continuation-graft ((struct continuation) (procedure () . *)) *)) +(continuation-return (procedure! continuation-return (procedure #!rest) . *)) ;XXX make return type more specific? + +(continuation? (procedure? (struct continuation) continuation? (*) boolean)) + +(copy-read-table (procedure! copy-read-table ((struct read-table)) (struct read-table))) +(cpu-time (procedure cpu-time () fixnum fixnum)) + +(current-error-port (procedure! current-error-port (#!optional port) port) + ((port) (set! ##sys#standard-error #(1))) + (() ##sys#standard-error)) + +(current-exception-handler + (procedure! current-exception-handler (#!optional procedure) procedure) + ((procedure) (set! ##sys#current-exception-handler #(1))) + (() ##sys#current-exception-handler)) + +(current-gc-milliseconds (procedure current-gc-milliseconds () fixnum)) +(current-milliseconds (procedure current-milliseconds () float)) +(current-read-table (procedure current-read-table () (struct read-table))) +(current-seconds (procedure current-seconds () float)) +(define-reader-ctor (procedure! define-reader-ctor (symbol procedure) undefined)) +(delete-file (procedure! delete-file (string) string)) +(enable-warnings (procedure enable-warnings (#!optional *) *)) +(equal=? (procedure equal=? (* *) boolean)) +(er-macro-transformer (procedure! er-macro-transformer ((procedure (* * *) *)) (struct transformer))) +(errno (procedure errno () fixnum)) +(error (procedure error (#!rest) noreturn)) +(##sys#error (procedure ##sys#error (#!rest) noreturn)) +(##sys#signal-hook (procedure ##sys#signal-hook (#!rest) noreturn)) +(exit (procedure exit (#!optional fixnum) noreturn)) +(exit-handler (procedure! exit-handler (#!optional procedure) procedure)) +(expand (procedure expand (* #!optional *) *)) +(extension-information (procedure extension-information (symbol) *)) +(feature? (procedure feature? (symbol) boolean)) +(features (procedure features () list)) +(file-exists? (procedure! file-exists? (string) *)) +(directory-exists? (procedure! directory-exists? (string) *)) +(fixnum-bits fixnum) +(fixnum-precision fixnum) + +(fixnum? (procedure? fixnum fixnum? (*) boolean)) + +(flonum-decimal-precision fixnum) +(flonum-epsilon float) +(flonum-maximum-decimal-exponent fixnum) +(flonum-maximum-exponent fixnum) +(flonum-minimum-decimal-exponent fixnum) +(flonum-minimum-exponent fixnum) +(flonum-precision fixnum) +(flonum-print-precision (procedure! (#!optional fixnum) fixnum)) +(flonum-radix fixnum) + +(flonum? (procedure? float flonum? (*) boolean)) + +(flush-output (procedure! flush-output (#!optional port) undefined)) + +(foldl (procedure! foldl ((procedure (* *) *) * list) *)) +(foldr (procedure! foldr ((procedure (* *) *) * list) *)) + +(force-finalizers (procedure force-finalizers () undefined)) + +(fp- (procedure! fp- (float float) float) + ((float float) (##core#inline_allocate ("C_a_i_flonum_difference" 4) #(1) #(2)) )) + +(fp* (procedure! fp* (float float) float) + ((float float) (##core#inline_allocate ("C_a_i_flonum_times" 4) #(1) #(2)) )) + +(fp/ (procedure! fp/ (float float) float) + ((float float) (##core#inline_allocate ("C_a_i_flonum_quotient" 4) #(1) #(2)) )) + +(fp+ (procedure! fp+ (float float) float) + ((float float) (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) #(2)) )) + +(fp< (procedure! fp< (float float) boolean) + ((float float) (##core#inline "C_flonum_lessp" #(1) #(2)) )) + +(fp<= (procedure! fp<= (float float) boolean) + ((float float) (##core#inline "C_flonum_less_or_equal_p" #(1) #(2)) )) + +(fp= (procedure! fp= (float float) boolean) + ((float float) (##core#inline "C_flonum_equalp" #(1) #(2)) )) + +(fp> (procedure! fp> (float float) boolean) + ((float float) (##core#inline "C_flonum_greaterp" #(1) #(2)) )) + +(fp>= (procedure! fp>= (float float) boolean) + ((float float) (##core#inline "C_flonum_greater_or_equal_p" #(1) #(2)) )) + +(fpabs (procedure! fpabs (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_abs" 4) #(1) ))) + +(fpacos (procedure! fpacos (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_acos" 4) #(1) ))) + +(fpasin (procedure! fpasin (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_asin" 4) #(1) ))) + +(fpatan (procedure! fpatan (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_atan" 4) #(1) ))) + +(fpatan2 (procedure! fpatan2 (float float) float) + ((float float) (##core#inline_allocate ("C_a_i_flonum_atan2" 4) + #(1) #(2)))) +(fpceiling (procedure! fpceiling (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_ceiling" 4) #(1) ))) + +(fpcos (procedure! fpcos (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_cos" 4) #(1) ))) + +(fpexp (procedure! fpexp (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_exp" 4) #(1) ))) + +(fpexpt (procedure! fpexpt (float float) float) + ((float float) (##core#inline_allocate ("C_a_i_flonum_expt" 4) + #(1) #(2)))) + +(fpfloor (procedure! fpfloor (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_floor" 4) #(1) ))) + +(fpinteger? (procedure! fpinteger? (float) boolean) + ((float) (##core#inline "C_u_i_flonum_intergerp" #(1) ))) + +(fplog (procedure! fplog (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_log" 4) #(1) ))) + +(fpmax (procedure! fpmax (float float) float) + ((float float) (##core#inline "C_i_flonum_max" #(1) #(2)))) + +(fpmin (procedure! fpmin (float float) float) + ((float float) (##core#inline "C_i_flonum_min" #(1) #(2)))) + +(fpneg (procedure! fpneg (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_negate" 4) #(1) ))) + +(fpround (procedure! fpround (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_round" 4) #(1) ))) + +(fpsin (procedure! fpsin (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_sin" 4) #(1) ))) + +(fpsqrt (procedure! fpsqrt (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_sqrt" 4) #(1) ))) + +(fptan (procedure! fptan (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_tan" 4) #(1) ))) + +(fptruncate (procedure! fptruncate (float) float) + ((float) (##core#inline_allocate ("C_a_i_flonum_truncate" 4) #(1) ))) + +(fx- (procedure fx- (fixnum fixnum) fixnum)) +(fx* (procedure fx* (fixnum fixnum) fixnum)) +(fx/ (procedure fx/ (fixnum fixnum) fixnum)) +(fx+ (procedure fx+ (fixnum fixnum) fixnum)) +(fx< (procedure fx< (fixnum fixnum) boolean)) +(fx<= (procedure fx<= (fixnum fixnum) boolean)) +(fx= (procedure fx= (fixnum fixnum) boolean)) +(fx> (procedure fx> (fixnum fixnum) boolean)) +(fx>= (procedure fx>= (fixnum fixnum) boolean)) +(fxand (procedure fxand (fixnum fixnum) fixnum)) +(fxeven? (procedure fxeven? (fixnum) boolean)) +(fxior (procedure fxior (fixnum fixnum) fixnum)) +(fxmax (procedure fxmax (fixnum fixnum) fixnum)) +(fxmin (procedure fxmin (fixnum fixnum) fixnum)) +(fxmod (procedure fxmod (fixnum fixnum) fixnum)) +(fxneg (procedure fxneg (fixnum) fixnum)) +(fxnot (procedure fxnot (fixnum) fixnum)) +(fxodd? (procedure fxodd? (fixnum) boolean)) +(fxshl (procedure fxshl (fixnum fixnum) fixnum)) +(fxshr (procedure fxshr (fixnum fixnum) fixnum)) +(fxxor (procedure fxxor (fixnum fixnum) fixnum)) +(gc (procedure gc (#!optional *) fixnum)) +(gensym (procedure gensym (#!optional *) symbol)) + +(get (procedure! get (symbol symbol #!optional *) *) + ((symbol symbol *) (##core#inline "C_i_getprop" #(1) #(2) #(3)))) + +(get-call-chain (procedure! get-call-chain (#!optional fixnum *) list)) +(get-condition-property (procedure! get-condition-property ((struct condition) symbol symbol #!optional *) *)) +(get-environment-variable (procedure! get-environment-variable (string) *)) +(get-keyword (procedure! get-keyword (symbol list #!optional *) *)) +(get-output-string (procedure! get-output-string (port) string)) +(get-properties (procedure! get-properties (symbol list) symbol * list)) +(getter-with-setter (procedure! getter-with-setter (procedure procedure #!optional string) procedure)) +(implicit-exit-handler (procedure! implicit-exit-handler (#!optional procedure) procedure)) +(ir-macro-transformer (procedure ir-macro-transformer ((procedure (* * *) *)) (struct transformer))) +(keyword->string (procedure! keyword->string (symbol) string)) +(keyword-style (procedure keyword-style (#!optional *) *)) +(keyword? (procedure keyword? (*) boolean)) +(load-library (procedure! load-library (symbol #!optional string) undefined)) +(load-relative (procedure! load-relative (string #!optional procedure) undefined)) +(load-verbose (procedure load-verbose (#!optional *) *)) +(machine-byte-order (procedure machine-byte-order () symbol)) +(machine-type (procedure machine-type () symbol)) + +(make-blob (procedure! make-blob (fixnum) blob) + ((fixnum) (##sys#make-blob #(1)))) + +(make-composite-condition (procedure! make-composite-condition (#!rest (struct condition)) (struct condition))) +(make-parameter (procedure! make-parameter (* #!optional procedure) procedure)) +(make-property-condition (procedure! make-property-condition (symbol #!rest *) (struct condition))) +(maximum-flonum float) +(memory-statistics (procedure memory-statistics () vector)) +(minimum-flonum float) +(most-negative-fixnum fixnum) +(most-positive-fixnum fixnum) +(on-exit (procedure! on-exit ((procedure () . *)) undefined)) +(open-input-string (procedure! open-input-string (string #!rest) port)) +(open-output-string (procedure open-output-string (#!rest) port)) +(parentheses-synonyms (procedure parentheses-synonyms (#!optional *) *)) + +(port-name (procedure! port-name (#!optional port) *) + ((port) (##sys#slot #(1) '3))) + +(port-position (procedure! port-position (#!optional port) fixnum)) + +(port? (procedure? port port? (*) boolean)) + +(print (procedure print (#!rest *) undefined)) +(print-call-chain (procedure! print-call-chain (#!optional port fixnum * string) undefined)) +(print-error-message (procedure! print-error-message (* #!optional port string) undefined)) +(print* (procedure print* (#!rest) undefined)) +(procedure-information (procedure! procedure-information (procedure) *)) +(program-name (procedure! program-name (#!optional string) string)) +(promise? (procedure? (struct promise) promise? (*) boolean)) + +(put! (procedure! put! (symbol symbol *) undefined) + ((symbol symbol *) + (##core#inline_allocate ("C_a_i_putprop" 8) #(1) #(2) #(3)))) + +(quit (procedure quit (#!optional *) noreturn)) +(register-feature! (procedure! register-feature! (#!rest symbol) undefined)) +(remprop! (procedure! remprop! (symbol symbol) undefined)) +(rename-file (procedure! rename-file (string string) string)) +(repl (procedure! repl (#!optional (procedure (*) *)) undefined)) +(repl-prompt (procedure! repl-prompt (#!optional procedure) procedure)) +(repository-path (procedure repository-path (#!optional *) *)) +(require (procedure require (#!rest *) undefined)) +(reset (procedure reset () undefined)) +(reset-handler (procedure! reset-handler (#!optional procedure) procedure)) +(return-to-host (procedure return-to-host () . *)) +(reverse-list->string (procedure! reverse-list->string (list) string)) +(set-finalizer! (procedure! set-finalizer! (* (procedure (*) . *)) *)) +(set-gc-report! (procedure set-gc-report! (*) undefined)) +(set-parameterized-read-syntax! (procedure! set-parameterized-read-syntax! (char procedure) undefined)) + +(set-port-name! (procedure! set-port-name! (port string) undefined) + ((port string) (##sys#setslot #(1) '3 #(2)))) + +(set-read-syntax! (procedure! set-read-syntax! (char procedure) undefined)) +(set-sharp-read-syntax! (procedure! set-sharp-read-syntax! (char procedure) undefined)) +(setter (procedure! setter (procedure) procedure)) +(signal (procedure signal (*) . *)) +(signum (procedure! signum (number) number)) +(software-type (procedure software-type () symbol)) +(software-version (procedure software-version () symbol)) +(string->blob (procedure! string->blob (string) blob)) +(string->keyword (procedure! string->keyword (string) symbol)) +(string->uninterned-symbol (procedure! string->uninterned-symbol (string) symbol)) +(strip-syntax (procedure strip-syntax (*) *)) + +(sub1 (procedure! sub1 (number) number) + ((float) (float) + (##core#inline_allocate ("C_a_i_flonum_difference" 4) #(1) '1.0))) + +(subvector (procedure! subvector (vector fixnum #!optional fixnum) vector)) +(symbol-escape (procedure symbol-escape (#!optional *) *)) + +(symbol-plist (procedure! symbol-plist (symbol) list) + ((symbol) (##sys#slot #(1) '2))) + +(syntax-error (procedure syntax-error (#!rest) noreturn)) +(system (procedure! system (string) fixnum)) +(unregister-feature! (procedure! unregister-feature! (#!rest symbol) undefined)) +(vector-resize (procedure! vector-resize (vector fixnum) vector)) +(void (procedure void (#!rest) undefined)) +(warning (procedure warning (#!rest) . *)) +(with-exception-handler (procedure! with-exception-handler (procedure procedure) . *)) + +;; chicken (internal) + +(##sys#foreign-char-argument (procedure! ##sys#foreign-char-argument (char) char) + ((char) #(1))) +(##sys#foreign-fixnum-argument (procedure! ##sys#foreign-fixnum-argument (fixnum) fixnum) + ((fixnum) #(1))) +(##sys#foreign-flonum-argument (procedure! ##sys#foreign-flonum-argument (number) number) + ((float) #(1))) +(##sys#foreign-string-argument (procedure! ##sys#foreign-string-argument (string) string) + ((string) #(1))) +(##sys#foreign-symbol-argument (procedure! ##sys#foreign-symbol-argument (symbol) symbol) + ((symbol) #(1))) +(##sys#foreign-pointer-argument (procedure! ##sys#foreign-pointer-argument (pointer) pointer) + ((pointer) #(1))) + +(##sys#check-blob (procedure! ##sys#check-blob (blob #!optional *) *) + ((blob) (let ((#(tmp) #(1))) '#t)) + ((blob *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-pair (procedure! ##sys#check-pair (pair #!optional *) *) + ((pair) (let ((#(tmp) #(1))) '#t)) + ((pair *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-list (procedure! ##sys#check-list (list #!optional *) *) + (((or null pair list)) (let ((#(tmp) #(1))) '#t)) + (((or null pair list) *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-string (procedure! ##sys#check-string (string #!optional *) *) + ((string) (let ((#(tmp) #(1))) '#t)) + ((string) * (let ((#(tmp) #(1))) '#t))) +(##sys#check-number (procedure! ##sys#check-number (number #!optional *) *) + ((number) (let ((#(tmp) #(1))) '#t)) + ((number *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-exact (procedure! ##sys#check-exact (fixnum #!optional *) *) + ((fixnum) (let ((#(tmp) #(1))) '#t)) + ((fixnum *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-inexact (procedure! ##sys#check-inexact (float #!optional *) *) + ((float) (let ((#(tmp) #(1))) '#t)) + ((float *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-symbol (procedure! ##sys#check-symbol (symbol #!optional *) *) + ((symbol) (let ((#(tmp) #(1))) '#t)) + ((symbol *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-vector (procedure! ##sys#check-vector (vector #!optional *) *) + ((vector) (let ((#(tmp) #(1))) '#t)) + ((vector *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-char (procedure! ##sys#check-char (char #!optional *) *) + ((char) (let ((#(tmp) #(1))) '#t)) + ((char *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-boolean (procedure! ##sys#check-boolean (boolean #!optional *) *) + ((boolean) (let ((#(tmp) #(1))) '#t)) + ((boolean *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-locative (procedure! ##sys#check-locative (locative #!optional *) *) + ((locative) (let ((#(tmp) #(1))) '#t)) + ((locative *) (let ((#(tmp) #(1))) '#t))) +(##sys#check-closure (procedure! ##sys#check-closure (procedure #!optional *) *) + ((procedure) (let ((#(tmp) #(1))) '#t)) + ((procedure *) (let ((#(tmp) #(1))) '#t))) + + +;; data-structures + +(->string (procedure ->string (*) string) + ((string) #(1))) + +(alist-ref (procedure! alist-ref (* list #!optional (procedure (* *) *) *) *)) +(alist-update! (procedure! alist-update! (* * list #!optional (procedure (* *) *)) *)) +(always? (procedure always? (#!rest) boolean)) + +(any? (procedure any? (*) boolean) + ((*) (let ((#(tmp) #(1))) '#t))) + +(atom? (procedure atom? (*) boolean) + ((pair) (let ((#(tmp) #(1))) '#f)) + (((not (or pair list))) (let ((#(tmp) #(1))) '#t))) + +(binary-search (procedure! binary-search (vector (procedure (*) *)) *)) +(butlast (procedure! butlast (pair) list)) +(chop (procedure! chop (list fixnum) list)) +(complement (procedure! complement (procedure) procedure)) +(compose (procedure! compose (#!rest procedure) procedure)) +(compress (procedure! compress (list list) list)) +(conc (procedure conc (#!rest) string)) +(conjoin (procedure! conjoin (#!rest (procedure (*) *)) (procedure (*) *))) +(constantly (procedure constantly (#!rest) . *)) +(disjoin (procedure! disjoin (#!rest (procedure (*) *)) (procedure (*) *))) +(each (procedure! each (#!rest procedure) procedure)) +(flatten (procedure! flatten (pair) list)) +(flip (procedure! flip ((procedure (* *) . *)) procedure)) +(identity (procedure identity (*) *)) +(intersperse (procedure! intersperse (list *) list)) +(join (procedure! join (list list) list)) +(list->queue (procedure! list->queue (list) (struct queue))) +(list-of? (procedure! list-of? ((procedure (*) *)) (procedure (list) boolean))) +(make-queue (procedure make-queue () (struct queue))) +(merge (procedure! merge (list list (procedure (* *) *)) list)) +(merge! (procedure! merge! (list list (procedure (* *) *)) list)) +(never? (procedure never? (#!rest) boolean)) + +(none? (procedure none? (*) boolean) + ((*) (let ((#(tmp) #(1))) '#f))) + +(o (procedure! o (#!rest (procedure (*) *)) (procedure (*) *))) + +(queue->list (procedure! queue->list ((struct queue)) list) + (((struct queue)) (##sys#slot #(1) '1))) + +(queue-add! (procedure! queue-add! ((struct queue) *) undefined)) + +(queue-empty? (procedure! queue-empty? ((struct queue)) boolean) + (((struct queue)) (##core#inline "C_i_nullp" (##sys#slot #(1) '1)))) + +(queue-first (procedure! queue-first ((struct queue)) *)) +(queue-last (procedure! queue-last ((struct queue)) *)) + +(queue-length (procedure! queue-length ((struct queue)) fixnum) + (((struct queue)) (##sys#slot #(1) '3))) + +(queue-push-back! (procedure! queue-push-back! ((struct queue) *) undefined)) +(queue-push-back-list! (procedure! queue-push-back-list! ((struct queue) list) undefined)) +(queue-remove! (procedure! queue-remove! ((struct queue)) *)) +(queue? (procedure? (struct queue) queue? (*) boolean)) + +(rassoc (procedure! rassoc (* list #!optional (procedure (* *) *)) *)) +(reverse-string-append (procedure! reverse-string-append (list) string)) +(shuffle deprecated) +(sort (procedure! sort ((or list vector) (procedure (* *) *)) (or list vector))) +(sort! (procedure! sort! ((or list vector) (procedure (* *) *)) (or list vector))) +(sorted? (procedure! sorted? ((or list vector) (procedure (* *) *)) boolean)) +(topological-sort (procedure! topological-sort (list (procedure (* *) *)) list)) +(string-chomp (procedure! string-chomp (string #!optional string) string)) +(string-chop (procedure! string-chop (string fixnum) list)) +(string-compare3 (procedure! string-compare3 (string string) fixnum)) +(string-compare3-ci (procedure! string-compare3-ci (string string) fixnum)) +(string-intersperse (procedure! string-intersperse (list #!optional string) string)) +(string-split (procedure! string-split (string #!optional string *) list)) +(string-translate (procedure! string-translate (string * #!optional *) string)) +(string-translate* (procedure! string-translate* (string list) string)) +(substring-ci=? (procedure! substring-ci=? (string string #!optional fixnum fixnum fixnum) boolean)) + +(substring-index (procedure! substring-index (string string #!optional fixnum) *) + ((* *) (##sys#substring-index #(1) #(2) '0)) + ((* * *) (##sys#substring-index #(1) #(2) #(3)))) + +(substring-index-ci (procedure! substring-index-ci (string string #!optional fixnum) *) + ((* *) (##sys#substring-index-ci #(1) #(2) '0)) + ((* * *) (##sys#substring-index-ci #(1) #(2) #(3)))) + +(substring=? (procedure! substring=? (string string #!optional fixnum fixnum fixnum) boolean)) +(tail? (procedure tail? (* *) boolean)) + +;; extras + +(format (procedure format (#!rest) *)) +(fprintf (procedure! fprintf (port string #!rest) undefined)) +(pp (procedure! pp (* #!optional port) undefined)) +(pretty-print (procedure! pretty-print (* #!optional port) undefined)) +(pretty-print-width (procedure pretty-print-width (#!optional *) *)) +(printf (procedure! printf (string #!rest) undefined)) +(random (procedure! random (number) number)) +(randomize (procedure! randomize (#!optional number) undefined)) +(read-buffered (procedure! read-buffered (#!optional port) string)) +(read-byte (procedure! read-byte (#!optional port) fixnum)) +(read-file (procedure! read-file (#!optional (or port string) (procedure (port) *) fixnum) list)) +(read-line (procedure! read-line (#!optional port (or boolean fixnum)) *)) +(read-lines (procedure! read-lines (#!optional (or port string) fixnum) list)) +(read-string (procedure! read-string (#!optional * port) string)) +(read-string! (procedure! read-string! (fixnum string #!optional port fixnum) fixnum)) +(read-token (procedure! read-token ((procedure (char) *) #!optional port) string)) +(sprintf (procedure! sprintf (string #!rest) string)) + +(write-byte (procedure! write-byte (fixnum #!optional port) undefined) + ((fixnum port) (##sys#write-char-0 (integer->char #(1)) #(2))) + ((fixnum) (##sys#write-char-0 (integer->char #(1)) ##sys#standard-output))) + +(write-line (procedure! write-line (string #!optional port) undefined)) +(write-string (procedure! write-string (string #!optional * port) undefined)) + +;; files + +(delete-file* (procedure! delete-file* (string) *)) +(file-copy (procedure! file-copy (string string #!optional * fixnum) fixnum)) +(file-move (procedure! file-move (string string #!optional * fixnum) fixnum)) +(make-pathname (procedure! make-pathname (* * #!optional string string) string)) +(directory-null? (procedure! directory-null? (string) boolean)) +(make-absolute-pathname (procedure! make-absolute-pathname (* * #!optional string string) string)) +(create-temporary-directory (procedure! create-temporary-directory () string)) +(create-temporary-file (procedure! create-temporary-file (#!optional string) string)) +(decompose-directory (procedure! decompose-directory (string) * * *)) +(decompose-pathname (procedure! decompose-pathname (string) * * *)) +(absolute-pathname? (procedure! absolute-pathname? (string) boolean)) +(pathname-directory (procedure! pathname-directory (string) *)) +(pathname-extension (procedure! pathname-extension (string) *)) +(pathname-file (procedure! pathname-file (string) *)) +(pathname-replace-directory (procedure! pathname-replace-directory (string string) string)) +(pathname-replace-extension (procedure! pathname-replace-extension (string string) string)) +(pathname-replace-file (procedure! pathname-replace-file (string string) string)) +(pathname-strip-directory (procedure! pathname-strip-directory (string) string)) +(pathname-strip-extension (procedure! pathname-strip-extension (string) string)) +(normalize-pathname (procedure! normalize-pathname (string #!optional symbol) string)) + +;; irregex + +(irregex (procedure irregex (#!rest) *)) +;irregex-apply-match + +(irregex-dfa (procedure! irregex-dfa ((struct regexp)) *) + (((struct regexp)) (##sys#slot #(1) '1))) + +(irregex-dfa/extract (procedure! irregex-dfa/extract ((struct regexp)) *) + (((struct regexp)) (##sys#slot #(1) '3))) + +(irregex-dfa/search (procedure! irregex-dfa/search ((struct regexp)) *) + (((struct regexp)) (##sys#slot #(1) '2))) + +(irregex-extract (procedure! irregex-extract (* string #!optional fixnum fixnum) list)) +(irregex-flags (procedure! irregex-flags ((struct regexp)) *) + (((struct regexp)) (##sys#slot #(1) '5))) + +(irregex-fold (procedure! irregex-fold (* (procedure (fixnum (struct regexp-match) *) *) * string #!optional (procedure (fixnum *) *) fixnum fixnum) *)) + +(irregex-fold/chunked (procedure! irregex-fold/chunked (* (procedure (* fixnum (struct regexp-match) *) *) * procedure * #!optional (procedure (* fixnum *) *) fixnum fixnum) *)) + +(irregex-lengths (procedure! irregex-lengths ((struct regexp)) *) + (((struct regexp)) (##sys#slot #(1) '7))) + +(irregex-match (procedure! irregex-match (* string) *)) +;irregex-match? + +(irregex-match-data? (procedure? (struct regexp-match) irregex-match-data? (*) boolean)) + +(irregex-match-end (procedure irregex-match-end (* #!optional *) *)) +;irregex-match-end-chunk +(irregex-match-end-index (procedure! irregex-match-end-index ((struct regexp-match) #!optional *) fixnum)) + +(irregex-match-names (procedure! irregex-match-names ((struct regexp-match)) list) + (((struct regexp-match)) (##sys#slot #(1) '2))) + +(irregex-match-num-submatches (procedure! irregex-match-num-submatches ((struct regexp-match)) fixnum)) +(irregex-match-start (procedure irregex-match-start (* #!optional *) *)) +;irregex-match-start-chunk +(irregex-match-start-index (procedure! irregex-match-start-index ((struct regexp-match) #!optional *) fixnum)) +(irregex-match-string (procedure irregex-match-string (*) *)) +(irregex-match-subchunk (procedure! irregex-match-subchunk ((struct regexp-match) #!optional *) *)) +(irregex-match-substring (procedure irregex-match-substring (* #!optional *) *)) +(irregex-match/chunked (procedure! irregex-match/chunked (* * * #!optional fixnum) *)) + +(irregex-names (procedure! irregex-names ((struct regexp)) *) + (((struct regexp)) (##sys#slot #(1) '8))) + +(irregex-new-matches (procedure irregex-new-matches (*) *)) + +(irregex-nfa (procedure! irregex-nfa ((struct regexp)) *) + (((struct regexp)) (##sys#slot #(1) '4))) + +(irregex-num-submatches (procedure! irregex-num-submatches ((struct regexp)) + fixnum) + (((struct regexp)) (##sys#slot #(1) '6))) + +(irregex-opt (procedure! irregex-opt (list) *)) +(irregex-quote (procedure! irregex-quote (string) string)) +(irregex-replace (procedure! irregex-replace (* string #!rest) *)) +(irregex-replace/all (procedure! irregex-replace/all (* string #!rest) *)) +(irregex-reset-matches! (procedure irregex-reset-matches! (*) *)) +(irregex-search (procedure! irregex-search (* string #!optional fixnum fixnum) *)) +(irregex-search/matches (procedure! irregex-search/matches (* string fixnum fixnum *) *)) +(irregex-split (procedure! irregex-split (* string #!optional fixnum fixnum) list)) +(irregex-search/chunked (procedure! irregex-search/chunked (* procedure * #!optional fixnum fixnum *) *)) +(irregex-match-valid-index? + (procedure! irregex-match-valid-index? ((struct regexp-match) *) boolean)) + +(irregex? (procedure? (struct regexp) irregex? (*) boolean)) + +(make-irregex-chunker + (procedure! make-irregex-chunker + ((procedure (*) *) + (procedure (*) *) + #!optional + (procedure (*) *) + (procedure (*) *) + (procedure (* fixnum * fixnum) string) + (procedure (* fixnum * fixnum) *)) + *)) +(maybe-string->sre (procedure maybe-string->sre (*) *)) +(sre->irregex (procedure sre->irregex (#!rest) *)) +(string->irregex (procedure! string->irregex (string #!rest) *)) +(string->sre (procedure! string->sre (string #!rest) *)) + +;; lolevel + +(address->pointer (procedure! address->pointer (fixnum) pointer) + ((fixnum) (##sys#address->pointer #(1)))) + +(align-to-word (procedure align-to-word ((or number pointer locative procedure port)) (or pointer number))) +(allocate (procedure! allocate (fixnum) (or boolean pointer))) +(block-ref (procedure! block-ref (* fixnum) *)) +(block-set! (procedure! block-set! (* fixnum *) *)) +(extend-procedure (procedure! extend-procedure (procedure *) procedure)) +(extended-procedure? (procedure extended-procedure? (*) boolean)) +(free (procedure! free (pointer) *)) +(locative->object (procedure! locative->object (locative) *)) +(locative-ref (procedure! locative-ref (locative) *)) +(locative-set! (procedure! locative-set! (locative *) *)) +(locative? (procedure locative? (*) boolean)) +(make-locative (procedure! make-locative (* #!optional fixnum) locative)) +(make-pointer-vector (procedure! make-pointer-vector (fixnum #!optional pointer) pointer-vector)) +(make-record-instance (procedure make-record-instance (* #!rest) *)) +(make-weak-locative (procedure! make-weak-locative (* #!optional fixnum) locative)) + +(move-memory! (procedure! move-memory! (* * #!optional fixnum fixnum fixnum) *) + ((pointer pointer fixnum) + (##core#inline "C_copy_ptr_memory" #(2) #(1) #(3) '0 '0)) + ((pointer pointer fixnum fixnum) + (##core#inline "C_copy_ptr_memory" #(2) #(1) #(3) '0 #(4))) + ((pointer pointer fixnum fixnum fixnum) + (##core#inline "C_copy_ptr_memory" #(2) #(1) #(3) #(5) #(4))) + ((locative locative fixnum) + (##core#inline "C_copy_ptr_memory" #(2) #(1) #(3) '0 '0)) + ((locative locative fixnum fixnum) + (##core#inline "C_copy_ptr_memory" #(2) #(1) #(3) '0 #(4))) + ((locative locative fixnum fixnum fixnum) + (##core#inline "C_copy_ptr_memory" #(2) #(1) #(3) #(5) #(4)))) + +(mutate-procedure (procedure! mutate-procedure (procedure procedure) procedure)) +(null-pointer deprecated) +(null-pointer? deprecated) + +(number-of-bytes (procedure number-of-bytes (*) fixnum) + (((or blob string)) (##sys#size #(1))) + (((or port procedure symbol pair vector locative float pointer-vector)) + ;; would be applicable to all structure types, but we can't specify + ;; "(struct *)" (yet) + (##core#inline "C_w2b" (##sys#size #(1))))) + +(number-of-slots (procedure number-of-slots (*) fixnum) + (((or vector symbol pair)) (##sys#size #(1)))) + +(object->pointer (procedure object->pointer (*) *)) +(object-become! (procedure object-become! (list) *)) +(object-copy (procedure object-copy (*) *)) +(object-evict (procedure! object-evict (* #!optional (procedure (fixnum) pointer)) *)) +(object-evict-to-location (procedure! object-evict-to-location (* (or pointer locative procedure port) #!optional fixnum) * pointer)) +(object-evicted? (procedure object-evicted? (*) boolean)) +(object-release (procedure! object-release (* #!optional (procedure (pointer) *)) *)) +(object-size (procedure object-size (*) fixnum)) +(object-unevict (procedure object-unevict (* #!optional *) *)) +(pointer+ (procedure! pointer+ ((or pointer procedure port locative) fixnum) pointer)) + +(pointer->address (procedure! pointer->address ((or pointer procedure port locative)) number) + ((pointer) (##sys#pointer->address #(1)))) + +(pointer->object (procedure! pointer->object (pointer) *) + ((pointer) (##core#inline "C_pointer_to_object" #(1)))) + +(pointer-like? (procedure pointer-like? (*) boolean) + (((or pointer locative procedure port)) (let ((#(tmp) #(1))) '#t))) + +(pointer-f32-ref (procedure! pointer-f32-ref (pointer) number)) +(pointer-f32-set! (procedure! pointer-f32-set! (pointer number) undefined)) +(pointer-f64-ref (procedure! pointer-f64-ref (pointer) number)) +(pointer-f64-set! (procedure! pointer-f64-set! (pointer number) undefined)) +(pointer-vector (procedure! pointer-vector (#!rest pointer-vector) boolean)) + +(pointer-vector? (procedure? pointer-vector pointer-vector? (*) boolean)) + +(pointer-vector-fill! (procedure! pointer-vector-fill! (pointer-vector pointer) undefined)) + +(pointer-vector-length (procedure! pointer-vector-length (pointer-vector) fixnum) + ((pointer-vector) (##sys#slot #(1) '1))) + +(pointer-vector-ref (procedure! pointer-vector-ref (pointer-vector fixnum) pointer)) +(pointer-vector-set! (procedure! pointer-vector-set! (pointer-vector fixnum pointer) undefined)) +(pointer-s16-ref (procedure! pointer-s16-ref (pointer) fixnum)) +(pointer-s16-set! (procedure! pointer-s16-set! (pointer fixnum) undefined)) +(pointer-s32-ref (procedure! pointer-s32-ref (pointer) number)) +(pointer-s32-set! (procedure! pointer-s32-set! (pointer number) undefined)) +(pointer-s8-ref (procedure! pointer-s8-ref (pointer) fixnum)) +(pointer-s8-set! (procedure! pointer-s8-set! (pointer fixnum) undefined)) + +(pointer-tag (procedure! pointer-tag ((or pointer locative procedure port)) (or boolean number)) + (((or locative procedure port)) (let ((#(tmp) #(1))) '#f))) + +(pointer-u16-ref (procedure! pointer-u16-ref (pointer) fixnum)) +(pointer-u16-set! (procedure! pointer-u16-set! (pointer fixnum) undefined)) +(pointer-u32-ref (procedure! pointer-u32-ref (pointer) number)) +(pointer-u32-set! (procedure! pointer-u32-set! (pointer number) undefined)) +(pointer-u8-ref (procedure! pointer-u8-ref (pointer) fixnum)) +(pointer-u8-set! (procedure! pointer-u8-set! (pointer fixnum) undefined)) + +(pointer=? (procedure! pointer=? ((or pointer locative procedure port) + (or pointer procedure locative port)) boolean) + ((pointer pointer) (##core#inline "C_pointer_eqp" #(1) #(2)))) + +(pointer? (procedure? pointer pointer? (*) boolean)) + +(procedure-data (procedure! procedure-data (procedure) *)) +(record->vector (procedure record->vector (*) vector)) +(record-instance? (procedure record-instance? (*) boolean)) +(record-instance-length (procedure record-instance-length (*) fixnum)) +(record-instance-slot (procedure! record-instance-slot (* fixnum) *)) +(record-instance-slot-set! (procedure! record-instance-slot-set! (* fixnum *) undefined)) +(record-instance-type (procedure record-instance-type (*) *)) +(set-procedure-data! (procedure! set-procedure-data! (procedure *) undefined)) +(tag-pointer (procedure! tag-pointer (pointer *) pointer)) +(tagged-pointer? (procedure! tagged-pointer? (* #!optional *) boolean)) + +;; ports + +(call-with-input-string (procedure! call-with-input-string (string (procedure (port) . *)) . *)) +(call-with-output-string (procedure! call-with-output-string ((procedure (port) . *)) string)) +(copy-port (procedure! copy-port (* * #!optional (procedure (*) *) (procedure (* *) *)) undefined)) +(make-input-port (procedure! make-input-port ((procedure () char) (procedure () *) (procedure () . *) #!optional * * * *) port)) +(make-output-port (procedure! make-output-port ((procedure (string) . *) (procedure () . *) #!optional (procedure () . *)) port)) +(port-for-each (procedure! port-for-each ((procedure (*) *) (procedure () . *)) undefined)) +(port-map (procedure! port-map ((procedure (*) *) (procedure () . *)) list)) +(port-fold (procedure! port-fold ((procedure (* *) *) * (procedure () *)) *)) +(make-broadcast-port (procedure! make-broadcast-port (#!rest port) port)) +(make-concatenated-port (procedure! make-concatenated-port (port #!rest port) port)) +(with-error-output-to-port (procedure! with-error-output-to-port (port (procedure () . *)) . *)) +(with-input-from-port (procedure! with-input-from-port (port (procedure () . *)) . *)) +(with-input-from-string (procedure! with-input-from-string (string (procedure () . *)) . *)) +(with-output-to-port (procedure! with-output-to-port (port (procedure () . *)) . *)) +(with-output-to-string (procedure! with-output-to-string ((procedure () . *)) . *)) + +;; posix + +(_exit (procedure _exit (fixnum) noreturn)) +(call-with-input-pipe (procedure! call-with-input-pipe (string (procedure (port) . *) #!optional symbol) . *)) +(call-with-output-pipe (procedure! call-with-output-pipe (string (procedure (port) . *) #!optional symbol) . *)) +(change-directory (procedure! change-directory (string) string)) +(change-file-mode (procedure! change-file-mode (string fixnum) undefined)) +(change-file-owner (procedure! change-file-owner (string fixnum fixnum) undefined)) +(close-input-pipe (procedure! close-input-pipe (port) fixnum)) +(close-output-pipe (procedure! close-output-pipe (port) fixnum)) +(create-directory (procedure! create-directory (string #!optional *) string)) +(create-fifo (procedure! create-fifo (string #!optional fixnum) undefined)) +(create-pipe (procedure create-pipe () fixnum fixnum)) +(create-session (procedure create-session () fixnum)) +(create-symbolic-link (procedure! create-symbolic-link (string string) undefined)) +(current-directory (procedure! current-directory (#!optional string) string)) +(current-effective-group-id (procedure current-effective-group-id () fixnum)) +(current-effective-user-id (procedure current-effective-user-id () fixnum)) +(current-effective-user-name (procedure current-effective-user-name () string)) +(current-environment deprecated) +(get-environment-variables (procedure get-environment-variables () list)) +(current-group-id (procedure current-group-id () fixnum)) +(current-process-id (procedure current-process-id () fixnum)) +(current-user-id (procedure current-user-id () fixnum)) +(current-user-name (procedure current-user-name () string)) +(delete-directory (procedure! delete-directory (string) string)) +(directory (procedure! directory (string #!optional *) list)) +(directory? (procedure! directory? ((or string fixnum)) boolean)) +(duplicate-fileno (procedure! duplicate-fileno (fixnum #!optional fixnum) fixnum)) +(errno/2big fixnum) +(errno/acces fixnum) +(errno/again fixnum) +(errno/badf fixnum) +(errno/busy fixnum) +(errno/child fixnum) +(errno/deadlk fixnum) +(errno/dom fixnum) +(errno/exist fixnum) +(errno/fault fixnum) +(errno/fbig fixnum) +(errno/ilseq fixnum) +(errno/intr fixnum) +(errno/inval fixnum) +(errno/io fixnum) +(errno/isdir fixnum) +(errno/mfile fixnum) +(errno/mlink fixnum) +(errno/nametoolong fixnum) +(errno/nfile fixnum) +(errno/nodev fixnum) +(errno/noent fixnum) +(errno/noexec fixnum) +(errno/nolck fixnum) +(errno/nomem fixnum) +(errno/nospc fixnum) +(errno/nosys fixnum) +(errno/notdir fixnum) +(errno/notempty fixnum) +(errno/notty fixnum) +(errno/nxio fixnum) +(errno/perm fixnum) +(errno/pipe fixnum) +(errno/range fixnum) +(errno/rofs fixnum) +(errno/spipe fixnum) +(errno/srch fixnum) +(errno/wouldblock fixnum) +(errno/xdev fixnum) +(fcntl/dupfd fixnum) +(fcntl/getfd fixnum) +(fcntl/getfl fixnum) +(fcntl/setfd fixnum) +(fcntl/setfl fixnum) +(file-access-time (procedure! file-access-time ((or string fixnum)) number)) +(file-change-time (procedure! file-change-time ((or string fixnum)) number)) +(file-close (procedure! file-close (fixnum) undefined)) +(file-control (procedure! file-control (fixnum fixnum #!optional fixnum) fixnum)) +(file-creation-mode (procedure! file-creation-mode (#!optional fixnum) fixnum)) +(file-execute-access? (procedure! file-execute-access? (string) boolean)) +(file-link (procedure! file-link (string string) undefined)) +(file-lock (procedure! file-lock (port #!optional fixnum *) (struct lock))) +(file-lock/blocking (procedure! file-lock/blocking (port #!optional fixnum *) (struct lock))) +(file-mkstemp (procedure! file-mkstemp (string) fixnum string)) +(file-modification-time (procedure! file-modification-time ((or string fixnum)) number)) +(file-open (procedure! file-open (string fixnum #!optional fixnum) fixnum)) +(file-owner (procedure! file-owner ((or string fixnum)) fixnum)) +(file-permissions (procedure! file-permissions ((or string fixnum)) fixnum)) +(file-position (procedure! file-position ((or port fixnum)) fixnum)) +(file-read (procedure! file-read (fixnum fixnum #!optional *) list)) +(file-read-access? (procedure! file-read-access? (string) boolean)) +(file-select (procedure! file-select (list list #!optional fixnum) list list)) +(file-size (procedure! file-size ((or string fixnum)) number)) +(file-stat (procedure! file-stat ((or string fixnum) #!optional *) vector)) +(file-test-lock (procedure! file-test-lock (port #!optional fixnum *) boolean)) +(file-truncate (procedure! file-truncate ((or string fixnum) fixnum) undefined)) +(file-type (procedure! ((or string fixnum) #!optional * *) symbol)) +(file-unlock (procedure! file-unlock ((struct lock)) undefined)) +(file-write (procedure! file-write (fixnum * #!optional fixnum) fixnum)) +(file-write-access? (procedure! file-write-access? (string) boolean)) +(fileno/stderr fixnum) +(fileno/stdin fixnum) +(fileno/stdout fixnum) +(find-files (procedure! find-files (string #!rest) list)) +(get-groups (procedure get-groups () list)) +(get-host-name (procedure get-host-name () string)) +(glob (procedure! glob (#!rest string) list)) +(group-information (procedure! group-information (fixnum #!optional *) *)) +(initialize-groups (procedure! initialize-groups (string fixnum) undefined)) +(local-time->seconds (procedure! local-time->seconds (vector) number)) +(local-timezone-abbreviation (procedure local-timezone-abbreviation () string)) +(map-file-to-memory (procedure! map-file-to-memory (* fixnum fixnum fixnum fixnum #!optional fixnum) (struct mmap))) +(map/anonymous fixnum) +(map/file fixnum) +(map/fixed fixnum) +(map/private fixnum) +(map/shared fixnum) +(memory-mapped-file-pointer (procedure! memory-mapped-file-pointer ((struct mmap)) pointer)) +(memory-mapped-file? (procedure memory-mapped-file? (*) boolean)) +(open-input-file* (procedure! open-input-file* (fixnum #!optional symbol) port)) +(open-input-pipe (procedure! open-input-pipe (string #!optional symbol) port)) +(open-output-file* (procedure! open-output-file* (fixnum #!optional symbol) port)) +(open-output-pipe (procedure! open-output-pipe (string #!optional symbol) port)) +(open/append fixnum) +(open/binary fixnum) +(open/creat fixnum) +(open/excl fixnum) +(open/fsync fixnum) +(open/noctty fixnum) +(open/nonblock fixnum) +(open/rdonly fixnum) +(open/rdwr fixnum) +(open/read fixnum) +(open/sync fixnum) +(open/text fixnum) +(open/trunc fixnum) +(open/write fixnum) +(open/wronly fixnum) +(parent-process-id (procedure parent-process-id () fixnum)) +(perm/irgrp fixnum) +(perm/iroth fixnum) +(perm/irusr fixnum) +(perm/irwxg fixnum) +(perm/irwxo fixnum) +(perm/irwxu fixnum) +(perm/isgid fixnum) +(perm/isuid fixnum) +(perm/isvtx fixnum) +(perm/iwgrp fixnum) +(perm/iwoth fixnum) +(perm/iwusr fixnum) +(perm/ixgrp fixnum) +(perm/ixoth fixnum) +(perm/ixusr fixnum) +(pipe/buf fixnum) +(port->fileno (procedure! port->fileno (port) fixnum)) +(process (procedure! process (string #!optional list list) port port fixnum)) +(process* (procedure! process* (string #!optional list list) port port fixnum *)) +(process-execute (procedure! process-execute (string #!optional list list) noreturn)) +(process-fork (procedure! process-fork (#!optional (procedure () . *)) fixnum)) +(process-group-id (procedure! process-group-id () fixnum)) +(process-run (procedure! process-run (string #!optional list) fixnum)) +(process-signal (procedure! process-signal (fixnum #!optional fixnum) undefined)) +(process-wait (procedure! process-wait (fixnum #!optional *) fixnum fixnum fixnum)) +(prot/exec fixnum) +(prot/none fixnum) +(prot/read fixnum) +(prot/write fixnum) +(read-symbolic-link (procedure! read-symbolic-link (string) string)) +(regular-file? (procedure! regular-file? ((or string fixnum)) boolean)) +(seconds->local-time (procedure! seconds->local-time (#!optional number) vector)) +(seconds->string (procedure! seconds->string (#!optional number) string)) +(seconds->utc-time (procedure! seconds->utc-time (#!optional number) vector)) +(seek/cur fixnum) +(seek/end fixnum) +(seek/set fixnum) +(set-alarm! (procedure! set-alarm! (number) number)) +(set-buffering-mode! (procedure! set-buffering-mode! (port symbol #!optional fixnum) undefined)) +(set-file-position! (procedure! set-file-position! ((or port fixnum) fixnum #!optional fixnum) undefined)) +(set-groups! (procedure! set-groups! (list) undefined)) +(set-root-directory! (procedure! set-root-directory! (string) undefined)) +(set-signal-handler! (procedure! set-signal-handler! (fixnum (procedure (fixnum) . *)) undefined)) +(set-signal-mask! (procedure! set-signal-mask! (list) undefined)) +(setenv (procedure! setenv (string string) undefined)) +(signal-handler (procedure! signal-handler (fixnum) (procedure (fixnum) . *))) +(signal-mask (procedure signal-mask () fixnum)) +(signal-mask! (procedure! signal-mask! (fixnum) undefined)) +(signal-masked? (procedure! signal-masked? (fixnum) boolean)) +(signal-unmask! (procedure! signal-unmask! (fixnum) undefined)) +(signal/abrt fixnum) +(signal/alrm fixnum) +(signal/chld fixnum) +(signal/cont fixnum) +(signal/fpe fixnum) +(signal/hup fixnum) +(signal/ill fixnum) +(signal/int fixnum) +(signal/io fixnum) +(signal/kill fixnum) +(signal/pipe fixnum) +(signal/prof fixnum) +(signal/quit fixnum) +(signal/segv fixnum) +(signal/stop fixnum) +(signal/term fixnum) +(signal/trap fixnum) +(signal/tstp fixnum) +(signal/urg fixnum) +(signal/usr1 fixnum) +(signal/usr2 fixnum) +(signal/vtalrm fixnum) +(signal/winch fixnum) +(signal/xcpu fixnum) +(signal/xfsz fixnum) +(signals-list list) +(sleep (procedure! sleep (fixnum) fixnum)) +(block-device? (procedure! block-device? ((or string fixnum)) boolean)) +(character-device? (procedure! character-device? ((or string fixnum)) boolean)) +(fifo? (procedure! fifo? ((or string fixnum)) boolean)) +(socket? (procedure! socket? ((or string fixnum)) boolean)) +(string->time (procedure! string->time (string #!optional string) vector)) +(symbolic-link? (procedure! symbolic-link? ((or string fixnum)) boolean)) +(system-information (procedure system-information () list)) +(terminal-name (procedure! terminal-name (port) string)) +(terminal-port? (procedure! terminal-port? (port) boolean)) +(terminal-size (procedure! terminal-size (port) fixnum fixnum)) +(time->string (procedure! time->string (vector #!optional string) string)) +(unmap-file-from-memory (procedure! unmap-file-from-memory ((struct mmap) #!optional fixnum) undefined)) +(unsetenv (procedure! unsetenv (string) undefined)) +(user-information (procedure! user-information ((or string fixnum) #!optional *) *)) +(utc-time->seconds (procedure! utc-time->seconds (vector) number)) +(with-input-from-pipe (procedure! with-input-from-pipe (string (procedure () . *) #!optional symbol) . *)) +(with-output-to-pipe (procedure! with-output-to-pipe (string (procedure () . *) #!optional symbol) . *)) + +;; srfi-1 + +(alist-cons (procedure alist-cons (* * *) list)) +(alist-copy (procedure! alist-copy (list) list)) +(alist-delete (procedure! alist-delete (* list #!optional (procedure (* *) *)) list)) +(alist-delete! (procedure! alist-delete! (* list #!optional (procedure (* *) *)) undefined)) +(any (procedure! any ((procedure (* #!rest) *) list #!rest list) *)) +(append! (procedure! append! (#!rest list) list)) +(append-map (procedure! append-map ((procedure (#!rest) *) list #!rest list) pair)) +(append-map! (procedure! append-map! ((procedure (#!rest) *) list #!rest list) pair)) +(append-reverse (procedure! append-reverse (list list) list)) +(append-reverse! (procedure! append-reverse! (list list) list)) +(break (procedure! break ((procedure (*) *) list) list list)) +(break! (procedure! break! ((procedure (*) *) list) list list)) +(car+cdr (procedure! car+cdr (pair) * *)) +(circular-list (procedure circular-list (#!rest) list)) + +(circular-list? (procedure circular-list? (*) boolean) + ((null) (let ((#(tmp) #(1))) '#f))) + +(concatenate (procedure! concatenate (list) list)) +(concatenate! (procedure! concatenate! (list) list)) +(cons* (procedure cons* (* #!rest) pair)) +(count (procedure! count ((procedure (*) *) list #!rest list) fixnum)) +(delete (procedure! delete (* list #!optional (procedure (* *) *)) list)) +(delete! (procedure! delete! (* list #!optional (procedure (* *) *)) list)) +(delete-duplicates (procedure! delete-duplicates (list #!optional (procedure (* *) *)) list)) +(delete-duplicates! (procedure! delete-duplicates! (list #!optional (procedure (* *) *)) list)) +(dotted-list? (procedure dotted-list? (*) boolean)) +(drop (procedure! drop (list fixnum) list)) +(drop-right (procedure! drop-right (list fixnum) list)) +(drop-right! (procedure! drop-right! (list fixnum) list)) +(drop-while (procedure! drop-while ((procedure (*) *) list) list)) +(eighth (procedure! eighth (pair) *)) +(every (procedure! every ((procedure (* #!rest) *) list #!rest list) *)) +(fifth (procedure! fifth (pair) *)) +(filter (procedure! filter ((procedure (*) *) list) list)) +(filter! (procedure! filter! ((procedure (*) *) list) list)) +(filter-map (procedure! filter-map ((procedure (* #!rest) *) list #!rest list) list)) +(find (procedure! find ((procedure (*) *) list) *)) +(find-tail (procedure! find-tail ((procedure (*) *) list) *)) + +(first (procedure! first (pair) *) + ((pair) (##core#inline "C_u_i_car" #(1)))) + +(fold (procedure! fold ((procedure (* #!rest) *) * #!rest list) *)) +(fold-right (procedure! fold-right ((procedure (* #!rest) *) * #!rest list) *)) +(fourth (procedure! fourth (pair) *)) +(iota (procedure! iota (fixnum #!optional fixnum fixnum) list)) +(last (procedure! last (pair) *)) +(last-pair (procedure! last-pair (pair) *)) +(length+ (procedure! length+ (list) *)) +(list-copy (procedure! list-copy (list) list)) +(list-index (procedure! list-index ((procedure (* #!rest) *) list #!rest list) *)) +(list-tabulate (procedure! list-tabulate (fixnum (procedure (fixnum) *)) list)) +(list= (procedure! list= (#!rest list) boolean)) +(lset-adjoin (procedure! lset-adjoin ((procedure (* *) *) list #!rest) list)) +(lset-diff+intersection (procedure! lset-diff+intersection ((procedure (* *) *) list #!rest list) list)) +(lset-diff+intersection! (procedure! lset-diff+intersection! ((procedure (* *) *) list #!rest list) list)) +(lset-difference (procedure! lset-difference ((procedure (* *) *) list #!rest list) list)) +(lset-difference! (procedure! lset-difference! ((procedure (* *) *) list #!rest list) list)) +(lset-intersection (procedure! lset-intersection ((procedure (* *) *) list #!rest list) list)) +(lset-intersection! (procedure! lset-intersection! ((procedure (* *) *) list #!rest list) list)) +(lset-union (procedure! lset-union ((procedure (* *) *) list #!rest list) list)) +(lset-union! (procedure! lset-union! ((procedure (* *) *) list #!rest list) list)) +(lset-xor (procedure! lset-xor ((procedure (* *) *) list #!rest list) list)) +(lset-xor! (procedure! lset-xor! ((procedure (* *) *) list #!rest list) list)) +(lset<= (procedure! lset<= ((procedure (* *) *) list #!rest list) boolean)) +(lset= (procedure! lset= ((procedure (* *) *) list #!rest list) boolean)) +(make-list (procedure! make-list (fixnum #!optional *) list)) +(map! (procedure! map! ((procedure (*) *) list #!rest list) list)) +(map-in-order (procedure! map-in-order ((procedure (*) *) list #!rest list) list)) +(ninth (procedure! ninth (pair) *)) + +(not-pair? (procedure not-pair? (*) boolean) + ((pair) (let ((#(tmp) #(1))) '#f)) + (((not (or pair list))) (let ((#(tmp) #(1))) '#t))) + +(null-list? (procedure! null-list? (list) boolean) + ((pair) (let ((#(tmp) #(1))) '#f)) + ((list) (let ((#(tmp) #(1))) '#f)) + ((null) (let ((#(tmp) #(1))) '#t))) + +(pair-fold (procedure! pair-fold (procedure * list #!rest list) *)) +(pair-fold-right (procedure! pair-fold-right (procedure * list #!rest list) *)) +(pair-for-each (procedure! pair-for-each ((procedure (#!rest) . *) list #!rest list) undefined)) +(partition (procedure! partition ((procedure (*) *) list) list list)) +(partition! (procedure! partition! ((procedure (*) *) list) list list)) + +(proper-list? (procedure proper-list? (*) boolean) + ((null) (let ((#(tmp) #(1))) '#t))) + +(reduce (procedure! reduce ((procedure (* *) *) * list) *)) +(reduce-right (procedure! reduce-right ((procedure (* *) *) * list) *)) +(remove (procedure! remove ((procedure (*) *) list) list)) +(remove! (procedure! remove! ((procedure (*) *) list) list)) +(reverse! (procedure! reverse! (list) list)) +(second (procedure! second (pair) *)) +(seventh (procedure! seventh (pair) *)) +(sixth (procedure! sixth (pair) *)) +(span (procedure! span ((procedure (*) *) list) list list)) +(span! (procedure! span! ((procedure (*) *) list) list list)) +(split-at (procedure! split-at (list fixnum) list list)) +(split-at! (procedure! split-at! (list fixnum) list list)) +(take (procedure! take (list fixnum) list)) +(take! (procedure! take! (list fixnum) list)) +(take-right (procedure! take-right (list fixnum) list)) +(take-while (procedure! take-while ((procedure (*) *) list) list)) +(take-while! (procedure! take-while! ((procedure (*) *) list) list)) +(tenth (procedure! tenth (pair) *)) +(third (procedure! third (pair) *)) +(unfold (procedure! unfold ((procedure (*) *) (procedure (*) *) (procedure (*) *) * #!optional (procedure (*) *)) *)) +(unfold-right (procedure! unfold-right ((procedure (*) *) (procedure (*) *) (procedure (*) *) * #!optional (procedure (*) *)) *)) +(unzip1 (procedure! unzip1 (list) list)) +(unzip2 (procedure! unzip2 (list) list list)) +(unzip3 (procedure! unzip3 (list) list list list)) +(unzip4 (procedure! unzip4 (list) list list list list)) +(unzip5 (procedure! unzip5 (list) list list list list list)) +(xcons (procedure xcons (* *) pair)) +(zip (procedure! zip (list #!rest list) list)) + +;; srfi-13 + +(check-substring-spec (procedure! check-substring-spec (* string fixnum fixnum) undefined)) +(kmp-step (procedure! kmp-step (string vector char fixnum (procedure (char char) *) fixnum) fixnum)) +(make-kmp-restart-vector (procedure! make-kmp-restart-vector (string #!optional (procedure (* *) *) fixnum fixnum) vector)) +(string-any (procedure! string-any (* string #!optional fixnum fixnum) boolean)) + +(string-append/shared (procedure! string-append/shared (#!rest string) string) + ((string string) (##sys#string-append #(1) #(2)))) + +(string-ci< (procedure! string-ci< (string string #!optional fixnum fixnum) boolean) + ((string string) (string-ci<? #(1) #(2)))) + +(string-ci<= (procedure! string-ci<= (string string #!optional fixnum fixnum) boolean) + ((string string) (string-ci<=? #(1) #(2)))) + +(string-ci<> (procedure! string-ci<> (string string #!optional fixnum fixnum) boolean) + ((string string) (not (##core#inline "C_i_string_ci_equal_p" #(1) #(2))))) + +(string-ci= (procedure! string-ci= (string string #!optional fixnum fixnum) boolean) + ((string string) (##core#inline "C_i_string_ci_equal_p" #(1) #(2)))) + +(string-ci> (procedure! string-ci> (string string #!optional fixnum fixnum) boolean) + ((string string) (string-ci>? #(1) #(2)))) + +(string-ci>= (procedure! string-ci>= (string string #!optional fixnum fixnum) boolean) + ((string string) (string-ci>=? #(1) #(2)))) + +(string-compare (procedure! string-compare (string string (procedure (fixnum) *) (procedure (fixnum) *) (procedure (fixnum) *) #!optional fixnum fixnum fixnum fixnum) *)) +(string-compare-ci (procedure! string-compare (string string (procedure (fixnum) *) (procedure (fixnum) *) (procedure (fixnum) *) #!optional fixnum fixnum fixnum fixnum) *)) +(string-concatenate (procedure! string-concatenate (list) string)) +(string-concatenate-reverse (procedure! string-concatenate-reverse (list #!optional string fixnum) string)) +(string-concatenate-reverse/shared (procedure! string-concatenate-reverse/shared (list #!optional string fixnum) string)) +(string-concatenate/shared (procedure! string-concatenate/shared (list) string)) +(string-contains (procedure! string-contains (string string #!optional fixnum fixnum fixnum fixnum) (or fixnum boolean))) +(string-contains-ci (procedure! string-contains-ci (string string #!optional fixnum fixnum fixnum fixnum) (or fixnum boolean))) +(string-copy (procedure! string-copy (string #!optional fixnum fixnum) string)) +(string-copy! (procedure! string-copy! (string fixnum string #!optional fixnum fixnum) undefined)) +(string-count (procedure! string-count (string * #!optional fixnum fixnum) fixnum)) +(string-delete (procedure! string-delete (* string #!optional fixnum fixnum) string)) +(string-downcase (procedure! string-downcase (string #!optional fixnum fixnum) string)) +(string-downcase! (procedure! string-downcase! (string #!optional fixnum fixnum) string)) +(string-drop (procedure! string-drop (string fixnum) string)) +(string-drop-right (procedure! string-drop-right (string fixnum) string)) +(string-every (procedure! string-every (* string #!optional fixnum fixnum) boolean)) +(string-fill! (procedure! string-fill! (string char #!optional fixnum fixnum) string)) +(string-filter (procedure! string-filter (* string #!optional fixnum fixnum) string)) +(string-fold (procedure! string-fold ((procedure (char *) *) * string #!optional fixnum fixnum) *)) +(string-fold-right (procedure! string-fold-right ((procedure (char *) *) * string #!optional fixnum fixnum) *)) +(string-for-each (procedure! string-for-each ((procedure (char) . *) string #!optional fixnum fixnum) undefined)) +(string-for-each-index (procedure! string-for-each-index ((procedure (fixnum) . *) string #!optional fixnum fixnum) undefined)) +(string-index (procedure! string-index (string * #!optional fixnum fixnum) (or fixnum boolean))) +(string-index-right (procedure! string-index-right (string * #!optional fixnum fixnum) (or fixnum boolean))) +(string-join (procedure! string-join (list #!optional string symbol) string)) +(string-kmp-partial-search (procedure! string-kmp-partial-search (string vector string fixnum #!optional (procedure (char char) *) fixnum fixnum fixnum) fixnum)) +(string-map (procedure! string-map ((procedure (char) char) string #!optional fixnum fixnum) string)) +(string-map! (procedure! string-map! ((procedure (char) char) string #!optional fixnum fixnum) string)) + +(string-null? (procedure! string-null? (string) boolean) + ((string) (##core#inline "C_zero_length_p" #(1)))) + +(string-pad (procedure! string-pad (string fixnum #!optional char fixnum fixnum) string)) +(string-pad-right (procedure! string-pad-right (string fixnum #!optional char fixnum fixnum) string)) +(string-parse-final-start+end (procedure! string-parse-final-start+end (procedure string #!rest) . *)) +(string-parse-start+end (procedure! string-parse-start+end (procedure string #!rest) . *)) +(string-prefix-ci? (procedure! string-prefix-ci? (string string #!optional fixnum fixnum fixnum fixnum) boolean)) +(string-prefix-length (procedure! string-prefix-length (string string #!optional fixnum fixnum fixnum fixnum) fixnum)) +(string-prefix-length-ci (procedure! string-prefix-length-ci (string string #!optional fixnum fixnum fixnum fixnum) fixnum)) +(string-prefix? (procedure! string-prefix? (string string #!optional fixnum fixnum fixnum fixnum) boolean)) +(string-replace (procedure! string-replace (string string fixnum fixnum #!optional fixnum fixnum) string)) +(string-reverse (procedure! string-reverse (string #!optional fixnum fixnum) string)) +(string-reverse! (procedure! string-reverse! (string #!optional fixnum fixnum) string)) +(string-skip (procedure! string-skip (string * #!optional fixnum fixnum) (or fixnum boolean))) +(string-skip-right (procedure! string-skip-right (string * #!optional fixnum fixnum) (or fixnum boolean))) +(string-suffix-ci? (procedure! string-suffix-ci? (string string #!optional fixnum fixnum fixnum fixnum) boolean)) +(string-suffix-length (procedure! string-suffix-length (string string #!optional fixnum fixnum fixnum fixnum) fixnum)) +(string-suffix-length-ci (procedure! string-suffix-length-ci (string string #!optional fixnum fixnum fixnum fixnum) fixnum)) +(string-suffix? (procedure! string-suffix? (string string #!optional fixnum fixnum fixnum fixnum) boolean)) +(string-tabulate (procedure! string-tabulate ((procedure (fixnum) char) fixnum) string)) +(string-take (procedure! string-take (string fixnum) string)) +(string-take-right (procedure! string-take-right (string fixnum) string)) +(string-titlecase (procedure! string-titlecase (string #!optional fixnum fixnum) string)) +(string-titlecase! (procedure! string-titlecase! (string #!optional fixnum fixnum) string)) +(string-tokenize (procedure! string-tokenize (string #!optional * fixnum fixnum) list)) +(string-trim (procedure! string-trim (string #!optional * fixnum fixnum) string)) +(string-trim-both (procedure! string-trim-both (string #!optional * fixnum fixnum) string)) +(string-trim-right (procedure! string-trim-right (string #!optional * fixnum fixnum) string)) +(string-unfold (procedure! string-unfold (procedure procedure procedure * #!optional * procedure) string)) +(string-unfold-right (procedure! string-unfold-right (procedure procedure procedure * #!optional * procedure) string)) +(string-upcase (procedure! string-upcase (string #!optional fixnum fixnum) string)) +(string-upcase! (procedure! string-upcase! (string #!optional fixnum fixnum) string)) +(string-xcopy! (procedure! string-xcopy! (string string string fixnum #!optional fixnum fixnum fixnum) string)) + +(string< (procedure! string< (string string #!optional fixnum fixnum fixnum fixnum) boolean) + ((string string) (string<? #(1) #(2)))) + +(string<= (procedure! string<= (string string #!optional fixnum fixnum fixnum fixnum) boolean) + ((string string) (string<=? #(1) #(2)))) + +(string<> (procedure! string<> (string string #!optional fixnum fixnum fixnum fixnum) boolean) + ((string string) (not (##core#inline "C_i_string_equal_p" #(1) #(2))))) + +(string= (procedure! string= (string string #!optional fixnum fixnum fixnum fixnum) boolean) + ((string string) (##core#inline "C_i_string_equal_p" #(1) #(2)))) + +(string> (procedure! string> (string string #!optional fixnum fixnum fixnum fixnum) boolean) + ((string string) (string>? #(1) #(2)))) + +(string>= (procedure! string>= (string string #!optional fixnum fixnum fixnum fixnum) boolean) + ((string string) (string>=? #(1) #(2)))) + +(substring-spec-ok? (procedure! substring-spec-ok? (string fixnum fixnum) boolean)) +(substring/shared (procedure! substring/shared (string fixnum #!optional fixnum) string)) +(xsubstring (procedure! xsubstring (string fixnum #!optional fixnum fixnum fixnum) string)) + +;; srfi-14 + +(->char-set (procedure ->char-set (*) (struct char-set)) + (((struct char-set)) #(1)) + ((string) (string->char-set #(1))) + ((char) (char-set #(1)))) + +(char-set (procedure! char-set (#!rest char) (struct char-set))) +(char-set->list (procedure! char-set->list ((struct char-set)) list)) +(char-set->string (procedure! char-set->string ((struct char-set)) string)) +(char-set-adjoin (procedure! char-set-adjoin ((struct char-set) #!rest char) (struct char-set))) +(char-set-adjoin! (procedure! char-set-adjoin! ((struct char-set) #!rest char) (struct char-set))) +(char-set-any (procedure! char-set-any ((procedure (char) *) (struct char-set)) *)) +(char-set-complement (procedure! char-set-complement ((struct char-set)) (struct char-set))) +(char-set-complement! (procedure! char-set-complement! ((struct char-set)) (struct char-set))) +(char-set-contains? (procedure! char-set-contains? ((struct char-set) char) boolean)) +(char-set-copy (procedure! char-set-copy ((struct char-set)) (struct char-set))) +(char-set-count (procedure! char-set-count ((procedure (char) *) (struct char-set)) fixnum)) +(char-set-cursor (procedure! char-set-cursor ((struct char-set)) fixnum)) +(char-set-cursor-next (procedure! char-set-cursor-next ((struct char-set) fixnum) fixnum)) +(char-set-delete (procedure! char-set-delete ((struct char-set) #!rest char) (struct char-set))) +(char-set-delete! (procedure! char-set-delete! ((struct char-set) #!rest char) (struct char-set))) +(char-set-diff+intersection (procedure! char-set-diff+intersection ((struct char-set) #!rest (struct char-set)) (struct char-set) (struct char-set))) +(char-set-diff+intersection! (procedure! char-set-diff+intersection! ((struct char-set) #!rest (struct char-set)) (struct char-set) (struct char-set))) +(char-set-difference (procedure! char-set-difference ((struct char-set) #!rest (struct char-set)) (struct char-set))) +(char-set-difference! (procedure! char-set-difference! ((struct char-set) #!rest (struct char-set)) (struct char-set))) +(char-set-every (procedure! char-set-every ((procedure (char) *) (struct char-set)) boolean)) +(char-set-filter (procedure! char-set-filter ((procedure (char) *) (struct char-set) #!optional (struct char-set)) (struct char-set))) +(char-set-filter! (procedure! char-set-filter! ((procedure (char) *) (struct char-set) #!optional (struct char-set)) (struct char-set))) +(char-set-fold (procedure! char-set-fold ((procedure (char *) *) * (struct char-set)) *)) +(char-set-for-each (procedure! char-set-for-each ((procedure (char) . *) (struct char-set)) undefined)) +(char-set-hash (procedure! char-set-hash ((struct char-set) #!optional number) number)) +(char-set-intersection (procedure! char-set-intersection (#!rest (struct char-set)) (struct char-set))) +(char-set-intersection! (procedure! char-set-intersection! (#!rest (struct char-set)) (struct char-set))) +(char-set-map (procedure! char-set-map ((procedure (char) char) (struct char-set)) (struct char-set))) +(char-set-ref (procedure! char-set-ref ((struct char-set) fixnum) char)) +(char-set-size (procedure! char-set-size ((struct char-set)) fixnum)) +(char-set-unfold (procedure! char-set-unfold (procedure procedure procedure * #!optional (struct char-set)) (struct char-set))) +(char-set-unfold! (procedure! char-set-unfold! (procedure procedure procedure * (struct char-set)) (struct char-set))) +(char-set-union (procedure! char-set-union (#!rest (struct char-set)) (struct char-set))) +(char-set-union! (procedure! char-set-union! (#!rest (struct char-set)) (struct char-set))) +(char-set-xor (procedure! char-set-xor (#!rest (struct char-set)) (struct char-set))) +(char-set-xor! (procedure! char-set-xor! (#!rest (struct char-set)) (struct char-set))) +(char-set:ascii (struct char-set)) +(char-set:blank (struct char-set)) +(char-set:digit (struct char-set)) +(char-set:empty (struct char-set)) +(char-set:full (struct char-set)) +(char-set:graphic (struct char-set)) +(char-set:hex-digit (struct char-set)) +(char-set:iso-control (struct char-set)) +(char-set:letter (struct char-set)) +(char-set:letter+digit (struct char-set)) +(char-set:lower-case (struct char-set)) +(char-set:printing (struct char-set)) +(char-set:punctuation (struct char-set)) +(char-set:symbol (struct char-set)) +(char-set:title-case (struct char-set)) +(char-set:upper-case (struct char-set)) +(char-set:whitespace (struct char-set)) +(char-set<= (procedure! char-set<= (#!rest (struct char-set)) boolean)) +(char-set= (procedure! char-set= (#!rest (struct char-set)) boolean)) + +(char-set? (procedure? (struct char-set) char-set? (*) boolean)) + +(end-of-char-set? (procedure! end-of-char-set? (fixnum) boolean)) +(list->char-set (procedure! list->char-set (list #!optional (struct char-set)) (struct char-set))) +(list->char-set! (procedure! list->char-set! (list #!optional (struct char-set)) (struct char-set))) +(string->char-set (procedure! string->char-set (string #!optional (struct char-set)) (struct char-set))) +(string->char-set! (procedure! string->char-set! (string #!optional (struct char-set)) (struct char-set))) +(ucs-range->char-set (procedure! ucs-range->char-set (fixnum fixnum #!optional * (struct char-set)) (struct char-set))) +(ucs-range->char-set! (procedure! ucs-range->char-set! (fixnum fixnum #!optional * (struct char-set)) (struct char-set))) + +;; srfi-18 + +(abandoned-mutex-exception? (procedure abandoned-mutex-exception? (*) boolean)) +(condition-variable-broadcast! (procedure! condition-variable-broadcast! ((struct condition-variable)) undefined)) +(condition-variable-name (procedure! condition-variable-name ((struct condition-variable)) *)) +(condition-variable-signal! (procedure! condition-variable-signal! ((struct condition-variable)) undefined)) +(condition-variable-specific (procedure! condition-variable-specific ((struct condition-variable)) *)) +(condition-variable-specific-set! (procedure! condition-variable-specific-set! ((struct condition-variable) *) undefined)) + +(condition-variable? (procedure? (struct condition-variable) condition-variable? (*) + boolean)) + +(current-thread (procedure current-thread () (struct thread))) ;XXX + +(current-time (procedure current-time () (struct time))) +(join-timeout-exception? (procedure join-timeout-exception? (*) boolean)) +(make-condition-variable (procedure make-condition-variable (#!optional *) (struct condition-variable))) +(make-mutex (procedure make-mutex (#!optional *) (struct mutex))) +(make-thread (procedure! make-thread ((procedure () . *) #!optional *) (struct thread))) +(milliseconds->time deprecated) +(mutex-lock! (procedure! mutex-lock! ((struct mutex) #!optional * (struct thread)) boolean)) + +(mutex-name (procedure! mutex-name ((struct mutex)) *) + (((struct mutex)) (##sys#slot #(1) '1))) + +(mutex-specific (procedure! mutex-specific ((struct mutex)) *) + (((struct mutex)) (##sys#slot #(1) '6))) + +(mutex-specific-set! (procedure! mutex-specific-set! ((struct mutex) *) undefined) + (((struct mutex) *) (##sys#setslot #(1) '6 #(2)))) + +(mutex-state (procedure! mutex-state ((struct mutex)) symbol)) +(mutex-unlock! (procedure! mutex-unlock! ((struct mutex) #!optional (struct condition-variable) *) undefined)) + +(mutex? (procedure? (struct mutex) mutex? (*) boolean)) + +(raise (procedure raise (*) noreturn)) +(seconds->time (procedure! seconds->time (number) (struct time))) +(terminated-thread-exception? (procedure terminated-thread-exception? (*) boolean)) +(thread-join! (procedure! thread-join! ((struct thread) #!optional * *) *)) + +(thread-name (procedure! thread-name ((struct thread)) *) + (((struct thread)) (##sys#slot #(1) '6))) + +(thread-quantum (procedure! thread-quantum ((struct thread)) fixnum) + (((struct thread)) (##sys#slot #(1) '9))) + +(thread-quantum-set! (procedure! thread-quantum-set! ((struct thread) fixnum) undefined)) +(thread-resume! (procedure! thread-resume! ((struct thread)) undefined)) +(thread-signal! (procedure! thread-signal! ((struct thread) *) undefined)) +(thread-sleep! (procedure thread-sleep! (*) undefined)) + +(thread-specific (procedure! thread-specific ((struct thread)) *) + (((struct thread)) (##sys#slot #(1) '10))) + +(thread-specific-set! (procedure! thread-specific-set! ((struct thread) *) undefined) + (((struct thread) *) (##sys#setslot #(1) '10 #(2)))) + +(thread-start! (procedure! thread-start! ((or (struct thread) (procedure () . *))) (struct thread))) + +(thread-state (procedure! thread-state ((struct thread)) symbol) + (((struct thread)) (##sys#slot #(1) '3))) + +(thread-suspend! (procedure! thread-suspend! ((struct thread)) undefined)) +(thread-terminate! (procedure! thread-terminate! ((struct thread)) undefined)) +(thread-wait-for-i/o! (procedure! thread-wait-for-i/o! (fixnum #!optional symbol) undefined)) +(thread-yield! (procedure thread-yield! () undefined)) + +(thread? (procedure? (struct thread) thread? (*) boolean)) + +(time->milliseconds deprecated) +(time->seconds (procedure! time->seconds ((struct time)) number)) + +(time? (procedure? (struct time) time? (*) boolean)) + +(uncaught-exception-reason (procedure! uncaught-exception-reason ((struct condition)) *)) +(uncaught-exception? (procedure uncaught-exception? (*) boolean)) + +;; srfi-4 + +(blob->f32vector (procedure! blob->f32vector (blob) (struct f32vector))) +(blob->f32vector/shared (procedure! blob->f32vector/shared (blob) (struct f32vector))) +(blob->f64vector (procedure! blob->f64vector (blob) (struct f64vector))) +(blob->f64vector/shared (procedure! blob->f64vector/shared (blob) (struct f64vector))) +(blob->s16vector (procedure! blob->s16vector (blob) (struct s16vector))) +(blob->s16vector/shared (procedure! blob->s16vector/shared (blob) (struct s16vector))) +(blob->s32vector (procedure! blob->s32vector (blob) (struct s32vector))) +(blob->s32vector/shared (procedure! blob->s32vector/shared (blob) (struct s32vector))) +(blob->s8vector (procedure! blob->s8vector (blob) (struct u8vector))) +(blob->s8vector/shared (procedure! blob->s8vector/shared (blob) (struct u8vector))) +(blob->u16vector (procedure! blob->u16vector (blob) (struct u16vector))) +(blob->u16vector/shared (procedure! blob->u16vector/shared (blob) (struct u16vector))) +(blob->u32vector (procedure! blob->u32vector (blob) (struct u32vector))) +(blob->u32vector/shared (procedure! blob->u32vector/shared (blob) (struct u32vector))) +(blob->u8vector (procedure! blob->u8vector (blob) (struct u8vector))) +(blob->u8vector/shared (procedure! blob->u8vector/shared (blob) (struct u8vector))) +(f32vector (procedure! f32vector (#!rest number) (struct f32vector))) +(f32vector->blob (procedure! f32vector->blob ((struct f32vector)) blob)) +(f32vector->blob/shared (procedure! f32vector->blob/shared ((struct f32vector)) blob)) +(f32vector->list (procedure! f32vector->list ((struct f32vector)) list)) + +(f32vector-length (procedure! f32vector-length ((struct f32vector)) fixnum) + (((struct f32vector)) (##core#inline "C_u_i_32vector_length" #(1)))) + +(f32vector-ref (procedure! f32vector-ref ((struct f32vector) fixnum) float)) +(f32vector-set! (procedure! f32vector-set! ((struct f32vector) fixnum number) undefined)) + +(f32vector? (procedure? (struct f32vector) f32vector? (*) boolean)) + +(f64vector (procedure! f64vector (#!rest number) (struct f64vector))) +(f64vector->blob (procedure! f64vector->blob ((struct f32vector)) blob)) +(f64vector->blob/shared (procedure! f64vector->blob/shared ((struct f64vector)) blob)) +(f64vector->list (procedure! f64vector->list ((struct f64vector)) blob)) + +(f64vector-length (procedure! f64vector-length ((struct f64vector)) fixnum) + (((struct f32vector)) (##core#inline "C_u_i_64vector_length" #(1)))) + +(f64vector-ref (procedure! f64vector-ref ((struct f64vector) fixnum) float)) +(f64vector-set! (procedure! f64vector-set! ((struct f64vector) fixnum number) undefined)) + +(f64vector? (procedure? (struct f64vector) f64vector? (*) boolean)) + +(list->f32vector (procedure! list->f32vector (list) (struct f32vector))) +(list->f64vector (procedure! list->f64vector (list) (struct f64vector))) +(list->s16vector (procedure! list->s16vector (list) (struct s16vector))) +(list->s32vector (procedure! list->s32vector (list) (struct s32vector))) +(list->s8vector (procedure! list->s8vector (list) (struct s8vector))) +(list->u16vector (procedure! list->u16vector (list) (struct u16vector))) +(list->u32vector (procedure! list->u32vector (list) (struct u32vector))) +(list->u8vector (procedure! list->u8vector (list) (struct u8vector))) +(make-f32vector (procedure! make-f32vector (fixnum #!optional * * *) (struct f32vector))) +(make-f64vector (procedure! make-f64vector (fixnum #!optional * * *) (struct f64vector))) +(make-s16vector (procedure! make-s16vector (fixnum #!optional * * *) (struct s16vector))) +(make-s32vector (procedure! make-s32vector (fixnum #!optional * * *) (struct s32vector))) +(make-s8vector (procedure! make-s8vector (fixnum #!optional * * *) (struct s8vector))) +(make-u16vector (procedure! make-u16vector (fixnum #!optional * * *) (struct u16vector))) +(make-u32vector (procedure! make-u32vector (fixnum #!optional * * *) (struct u32vector))) +(make-u8vector (procedure! make-u8vector (fixnum #!optional * * *) (struct u8vector))) +(read-u8vector (procedure! read-u8vector (#!optional fixnum port) (struct u8vector))) +(read-u8vector! (procedure! read-u8vector! (fixnum (struct u8vector) #!optional port fixnum) number)) +(release-number-vector (procedure release-number-vector (*) undefined)) +(s16vector (procedure! s16vector (#!rest fixnum) (struct s16vector))) +(s16vector->blob (procedure! s16vector->blob ((struct s16vector)) blob)) +(s16vector->blob/shared (procedure! s16vector->blob/shared ((struct s16vector)) blob)) +(s16vector->list (procedure! s16vector->list ((struct s16vector)) list)) + +(s16vector-length (procedure! s16vector-length ((struct s16vector)) fixnum) + (((struct s16vector)) (##core#inline "C_u_i_16vector_length" #(1)))) + +(s16vector-ref (procedure! s16vector-ref ((struct s16vector) fixnum) fixnum)) +(s16vector-set! (procedure! s16vector-set! ((struct s16vector) fixnum fixnum) undefined)) + +(s16vector? (procedure? (struct s16vector) s16vector? (*) boolean)) + +(s32vector (procedure! s32vector (#!rest number) (struct s32vector))) +(s32vector->blob (procedure! s32vector->blob ((struct 32vector)) blob)) +(s32vector->blob/shared (procedure! s32vector->blob/shared ((struct s32vector)) blob)) +(s32vector->list (procedure! s32vector->list ((struct s32vector)) list)) + +(s32vector-length (procedure! s32vector-length ((struct s32vector)) fixnum) + (((struct s32vector)) (##core#inline "C_u_i_32vector_length" #(1)))) + +(s32vector-ref (procedure! s32vector-ref ((struct s32vector) fixnum) number)) +(s32vector-set! (procedure! s32vector-set! ((struct s32vector) fixnum number) undefined)) + +(s32vector? (procedure? (struct s32vector) s32vector? (*) boolean)) + +(s8vector (procedure! s8vector (#!rest fixnum) (struct s8vector))) +(s8vector->blob (procedure! s8vector->blob ((struct s8vector)) blob)) +(s8vector->blob/shared (procedure! s8vector->blob/shared ((struct s8vector)) blob)) +(s8vector->list (procedure! s8vector->list ((struct s8vector)) list)) + +(s8vector-length (procedure! s8vector-length ((struct s8vector)) fixnum) + (((struct s8vector)) (##core#inline "C_u_i_8vector_length" #(1)))) + +(s8vector-ref (procedure! s8vector-ref ((struct s8vector) fixnum) fixnum)) +(s8vector-set! (procedure! s8vector-set! ((struct s8vector) fixnum fixnum) undefined)) + +(s8vector? (procedure? (struct s8vector) s8vector? (*) boolean)) + +(subf32vector (procedure! subf32vector ((struct f32vector) fixnum fixnum) (struct f32vector))) +(subf64vector (procedure! subf64vector ((struct f64vector) fixnum fixnum) (struct f64vector))) +(subs16vector (procedure! subs16vector ((struct s16vector) fixnum fixnum) (struct s16vector))) +(subs32vector (procedure! subs32vector ((struct s32vector) fixnum fixnum) (struct s32vector))) +(subs8vector (procedure! subs8vector ((struct s8vector) fixnum fixnum) (struct s8vector))) +(subu16vector (procedure! subu16vector ((struct u16vector) fixnum fixnum) (struct u16vector))) +(subu32vector (procedure! subu32vector ((struct u32vector) fixnum fixnum) (struct u32vector))) +(subu8vector (procedure! subu8vector ((struct u8vector) fixnum fixnum) (struct u8vector))) +(u16vector (procedure! u16vector (#!rest fixnum) (struct u16vector))) +(u16vector->blob (procedure! u16vector->blob ((struct u16vector)) blob)) +(u16vector->blob/shared (procedure! u16vector->blob/shared ((struct u16vector)) blob)) +(u16vector->list (procedure! u16vector->list ((struct u16vector)) list)) + +(u16vector-length (procedure! u16vector-length ((struct u16vector)) fixnum) + (((struct u16vector)) (##core#inline "C_u_i_16vector_length" #(1)))) + +(u16vector-ref (procedure! u16vector-ref ((struct u16vector) fixnum) fixnum)) +(u16vector-set! (procedure! u16vector-set! ((struct u16vector) fixnum fixnum) undefined)) + +(u16vector? (procedure? (struct u16vector) u16vector? (*) boolean)) + +(u32vector (procedure! u32vector (#!rest number) (struct u32vector))) +(u32vector->blob (procedure! u32vector->blob ((struct u32vector)) blob)) +(u32vector->blob/shared (procedure! u32vector->blob/shared ((struct u32vector)) blob)) +(u32vector->list (procedure! u32vector->list ((struct u32vector)) list)) + +(u32vector-length (procedure! u32vector-length ((struct u32vector)) fixnum) + (((struct u32vector)) (##core#inline "C_u_i_32vector_length" #(1)))) + +(u32vector-ref (procedure! u32vector-ref ((struct u32vector) fixnum) number)) +(u32vector-set! (procedure! u32vector-set! ((struct u32vector) fixnum number) undefined)) + +(u32vector? (procedure? (struct u32vector) u32vector? (*) boolean)) + +(u8vector (procedure! u8vector (#!rest fixnum) (struct u8vector))) +(u8vector->blob (procedure! u8vector->blob ((struct u8vector)) blob)) +(u8vector->blob/shared (procedure! u8vector->blob/shared ((struct u8vector)) blob)) +(u8vector->list (procedure! u8vector->list ((struct u8vector)) list)) + +(u8vector-length (procedure! u8vector-length ((struct u8vector)) fixnum) + (((struct u8vector)) (##core#inline "C_u_i_8vector_length" #(1)))) + +(u8vector-ref (procedure! u8vector-ref ((struct u8vector) fixnum) fixnum)) +(u8vector-set! (procedure! u8vector-set! ((struct u8vector) fixnum fixnum) undefined)) + +(u8vector? (procedure? (struct u8vector) u8vector? (*) boolean)) + +(write-u8vector (procedure! write-u8vector ((struct u8vector) #!optional port fixnum fixnum) undefined)) + +;; srfi-69 + +(alist->hash-table (procedure! alist->hash-table (list #!rest) (struct hash-table))) +(eq?-hash (procedure! eq?-hash (* #!optional fixnum) fixnum)) +(equal?-hash (procedure! equal?-hash (* #!optional fixnum) fixnum)) +(eqv?-hash (procedure! eqv?-hash (* #!optional fixnum) fixnum)) +(hash (procedure! hash (* #!optional fixnum) fixnum)) +(hash-by-identity (procedure! hash-by-identity (* #!optional fixnum) fixnum)) +(hash-table->alist (procedure! hash-table->alist ((struct hash-table)) list)) +(hash-table-clear! (procedure! hash-table-clear! ((struct hash-table)) undefined)) +(hash-table-copy (procedure! hash-table-copy ((struct hash-table)) (struct hash-table))) +(hash-table-delete! (procedure! hash-table-delete! ((struct hash-table) *) boolean)) +(hash-table-equivalence-function (procedure! hash-table-equivalence-function ((struct hash-table)) (procedure (* *) *))) +(hash-table-exists? (procedure! hash-table-exists? ((struct hash-table) *) boolean)) +(hash-table-fold (procedure! hash-table-fold ((struct hash-table) (procedure (* * *) *) *) *)) +(hash-table-for-each (procedure! hash-table-for-each ((struct hash-table) (procedure (* *) . *)) undefined)) + +(hash-table-has-initial? (procedure! hash-table-has-initial? ((struct hash-table)) boolean) + (((struct hash-table)) (##sys#slot #(1) '9))) ;XXX might return other than #t + +(hash-table-hash-function (procedure! hash-table-hash-function ((struct hash-table)) (procedure (* fixnum) fixnum)) + (((struct hash-table)) (##sys#slot #(1) '4))) + +(hash-table-initial (procedure! hash-table-initial ((struct hash-table)) *)) +(hash-table-keys (procedure! hash-table-keys ((struct hash-table)) list)) +(hash-table-map (procedure! hash-table-map ((struct hash-table) (procedure (* *) *)) list)) + +(hash-table-max-load (procedure! hash-table-max-load ((struct hash-table)) fixnum) + (((struct hash-table)) (##sys#slot #(1) '6))) + +(hash-table-merge (procedure! hash-table-merge ((struct hash-table) (struct hash-table)) (struct hash-table))) +(hash-table-merge! (procedure! hash-table-merge! ((struct hash-table) (struct hash-table)) undefined)) + +(hash-table-min-load (procedure! hash-table-min-load ((struct hash-table)) fixnum) + (((struct hash-table)) (##sys#slot #(1) '5))) + +(hash-table-ref (procedure! hash-table-ref ((struct hash-table) * #!optional (procedure () *)) *)) +(hash-table-ref/default (procedure! hash-table-ref/default ((struct hash-table) * *) *)) +(hash-table-remove! (procedure! hash-table-remove! ((struct hash-table) (procedure (* *) *)) undefined)) +(hash-table-set! (procedure! hash-table-set! ((struct hash-table) * *) undefined)) + +(hash-table-size (procedure! hash-table-size ((struct hash-table)) fixnum) + (((struct hash-table)) (##sys#slot #(1) '2))) + +(hash-table-update! (procedure! hash-table-update! ((struct hash-table) * (procedure (*) *) #!optional (procedure () *)) *)) +(hash-table-update!/default (procedure! hash-table-update!/default ((struct hash-table) * (procedure (*) *) *) *)) +(hash-table-values (procedure! hash-table-values ((struct hash-table)) list)) +(hash-table-walk (procedure! hash-table-walk ((struct hash-table) (procedure (* *) . *)) undefined)) + +(hash-table-weak-keys (procedure! hash-table-weak-keys ((struct hash-table)) boolean) + (((struct hash-table)) (##sys#slot #(1) '7))) + +(hash-table-weak-values (procedure! hash-table-weak-values ((struct hash-table)) boolean) + (((struct hash-table)) (##sys#slot #(1) '8))) + +(hash-table? (procedure? (struct hash-table) hash-table? (*) boolean)) + +;;XXX if we want to hardcode hash-default-bound here, we could rewrite the 1-arg case... +; (applies to all hash-functions) +(keyword-hash (procedure! keyword-hash (* #!optional fixnum) fixnum)) + +(make-hash-table (procedure! make-hash-table (#!rest) (struct hash-table))) +(number-hash (procedure! number-hash (fixnum #!optional fixnum) fixnum)) +(object-uid-hash (procedure! object-uid-hash (* #!optional fixnum) fixnum)) +(symbol-hash (procedure! symbol-hash (symbol #!optional fixnum) fixnum)) +(string-hash (procedure! string-hash (string #!optional fixnum fixnum fixnum) number)) +(string-hash-ci (procedure! string-hash-ci (string #!optional fixnum fixnum fixnum) number)) +(string-ci-hash (procedure! string-ci-hash (string #!optional fixnum fixnum fixnum) number)) + +;; tcp + +(tcp-abandon-port (procedure! tcp-abandon-port (port) undefined)) +(tcp-accept (procedure! tcp-accept ((struct tcp-listener)) port port)) +(tcp-accept-ready? (procedure! tcp-accept-ready? ((struct tcp-listener)) boolean)) +(tcp-accept-timeout (procedure! tcp-accept-timeout (#!optional number) number)) +(tcp-addresses (procedure! tcp-addresses (port) string string)) +(tcp-buffer-size (procedure! tcp-buffer-size (#!optional fixnum) fixnum)) +(tcp-close (procedure! tcp-close ((struct tcp-listener)) undefined)) +(tcp-connect (procedure! tcp-connect (string #!optional fixnum) port port)) +(tcp-connect-timeout (procedure! tcp-connect-timeout (#!optional number) number)) +(tcp-listen (procedure! tcp-listen (fixnum #!optional fixnum *) (struct tcp-listener))) + +(tcp-listener-fileno (procedure! tcp-listener-fileno ((struct tcp-listener)) fixnum) + (((struct tcp-listener)) (##sys#slot #(1) '1))) + +(tcp-listener-port (procedure! tcp-listener-port ((struct tcp-listener)) fixnum)) + +(tcp-listener? (procedure? (struct tcp-listener) tcp-listener? (*) boolean)) + +(tcp-port-numbers (procedure! tcp-port-numbers (port) fixnum fixnum)) +(tcp-read-timeout (procedure! tcp-read-timeout (#!optional number) number)) +(tcp-write-timeout (procedure! tcp-write-timeout (#!optional number) number)) + +;; utils + +(for-each-argv-line deprecated) +(for-each-line deprecated) +(read-all (procedure! read-all (#!optional (or port string)) string)) +(system* (procedure! system* (string #!rest) undefined)) +(qs (procedure! qs (string) string)) +(compile-file (procedure! compile-file (string #!rest) (or boolean string))) +(compile-file-options (procedure! compile-file-options (#!optional list) list)) +(scan-input-lines (procedure! scan-input-lines (* #!optional port) *)) +(yes-or-no? (procedure! yes-or-no? (string #!rest) *))Trap