source: project/chicken/branches/release/scheme-complete.el @ 7276

Last change on this file since 7276 was 7276, checked in by felix winkelmann, 12 years ago

merged trunk

File size: 145.0 KB
Line 
1;;; scheme-complete.el              -*- Emacs-Lisp -*-
2
3;;; Smart tab completion for Emacs
4
5;;; This code is written by Alex Shinn and placed in the Public
6;;; Domain.  All warranties are disclaimed.
7
8;;; This file provides a single function, `scheme-smart-complete',
9;;; which you can use for intelligent, context-sensitive completion
10;;; for any Scheme implementation.  To use it just load this file and
11;;; bind that function to a key in your preferred mode:
12;;;
13;;; (autoload 'scheme-smart-complete "scheme-complete" nil t)
14;;; (eval-after-load 'scheme
15;;;   '(progn (define-key scheme-mode-map "\e\t" 'scheme-smart-complete)))
16;;;
17;;; Alternately, you may want to just bind TAB to the
18;;; `scheme-complete-or-indent' function, which indents at the start
19;;; of a line and otherwise performs the smart completion:
20;;;
21;;; (eval-after-load 'scheme
22;;;   '(progn (define-key scheme-mode-map "\t" 'scheme-complete-or-indent)))
23;;;
24;;; If you use eldoc-mode (included in Emacs), you can also get live
25;;; scheme documentation with:
26;;;
27;;; (autoload 'scheme-get-current-symbol-info "scheme-complete" nil t)
28;;; (add-hook 'scheme-mode-hook
29;;;   (lambda ()
30;;;     (setq eldoc-info-function 'scheme-get-current-symbol-info)
31;;;     (eldoc-mode)))
32;;;
33;;; That's all there is to it.
34
35;;; History:
36;;;   0.4: 2007/11/14 - silly bugfixe plus better repo env support
37;;;                     for searching chicken and gauche modules
38;;;   0.3: 2007/11/13 - bugfixes, better inference, smart strings
39;;;   0.2: 2007/10/15 - basic type inference
40;;;   0.1: 2007/09/11 - initial release
41;;;
42;;;   What is this talk of 'release'? Klingons do not make software
43;;;   'releases'. Our software 'escapes' leaving a bloody trail of
44;;;   designers and quality assurance people in its wake.
45
46(require 'cl)
47
48;; this is just to eliminate some warnings when compiling - this file
49;; should be loaded after 'scheme
50(eval-when (compile)
51  (require 'scheme))
52
53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
54;; info
55;;
56;; identifier type [doc-string no-type-display?]
57;;
58;; types:
59;;
60;;   pair, number, symbol, etc.
61;;   (lambda (param-types) [return-type])
62;;   (syntax (param-types) [return-type])
63;;   (set name values ...)
64;;   (flags name values ...)
65;;   (special function [outer-function])
66
67(defvar *scheme-r5rs-info*
68  '((define (syntax (identifier value) undefined) "define a new variable")
69    (set! (syntax (identifier value) undefined) "set the value of a variable")
70    (let (syntax (vars body |...|)) "bind new local variables in parallel")
71    (let* (syntax (vars body |...|)) "bind new local variables sequentially")
72    (letrec (syntax (vars body |...|)) "bind new local variables recursively")
73    (lambda (syntax (params body |...|)) "procedure syntax")
74    (if (syntax (cond then else)) "conditional evaluation")
75    (cond (syntax (clause |...|)) "try each clause until one succeeds")
76    (case (syntax (expr clause |...|)) "look for EXPR among literal lists")
77    (delay (syntax (expr)) "create a promise to evaluate EXPR")
78    (and (syntax (expr |...|)) "evaluate EXPRs while true, return last")
79    (or (syntax (expr |...|)) "return the first true EXPR")
80    (begin (syntax (expr |...|)) "evaluate each EXPR in turn and return the last")
81    (do (syntax (vars finish body |...|)) "simple iterator")
82    (quote (syntax (expr)) "represent EXPR literally without evaluating it")
83    (quasiquote (syntax (expr)) "quote literals allowing escapes")
84    (unquote (syntax (expr)) "escape an expression inside quasiquote")
85    (unquote-splicing (syntax (expr)) "escape and splice a list expression inside quasiquote")
86    (define-syntax (syntax (identifier body |...|) undefined) "create a macro")
87    (let-syntax (syntax (syntaxes body |...|)) "a local macro")
88    (letrec-syntax (syntax (syntaxes body |...|)) "a local macro")
89    (syntax-rules (syntax (literals clauses |...|) undefined) "simple macro language")
90    (eqv? (lambda (obj1 obj2) bool) "returns #t if OBJ1 and OBJ2 are the same object")
91    (eq? (lambda (obj1 obj2) bool) "finer grained version of EQV?")
92    (equal? (lambda (obj1 obj2) bool) "recursive equivalence")
93    (not (lambda (obj) bool) "returns #t iff OBJ is false")
94    (boolean? (lambda (obj) bool) "returns #t iff OBJ is #t or #f")
95    (number? (lambda (obj) bool) "returns #t iff OBJ is a number")
96    (complex? (lambda (obj) bool) "returns #t iff OBJ is a complex number")
97    (real? (lambda (obj) bool) "returns #t iff OBJ is a real number")
98    (rational? (lambda (obj) bool) "returns #t iff OBJ is a rational number")
99    (integer? (lambda (obj) bool) "returns #t iff OBJ is an integer")
100    (exact? (lambda (z) bool) "returns #t iff Z is exact")
101    (inexact? (lambda (z) bool) "returns #t iff Z is inexact")
102    (= (lambda (z1 z2 |...|) bool) "returns #t iff the arguments are all equal")
103    (< (lambda (x1 x2 |...|) bool) "returns #t iff the arguments are monotonically increasing")
104    (> (lambda (x1 x2 |...|) bool) "returns #t iff the arguments are monotonically decreasing")
105    (<= (lambda (x1 x2 |...|) bool) "returns #t iff the arguments are monotonically nondecreasing")
106    (>= (lambda (x1 x2 |...|) bool) "returns #t iff the arguments are monotonically nonincreasing")
107    (zero? (lambda (z) bool))
108    (positive? (lambda (x) bool))
109    (negative? (lambda (x) bool))
110    (odd? (lambda (n) bool))
111    (even? (lambda (n) bool))
112    (max (lambda (x1 x2 |...|) x) "returns the maximum of the arguments")
113    (min (lambda (x1 x2 |...|) x) "returns the minimum of the arguments")
114    (+ (lambda (z1 |...|) z))
115    (* (lambda (z1 |...|) z))
116    (- (lambda (z1 |...|) z))
117    (/ (lambda (z1 |...|) z))
118    (abs (lambda (x) x) "returns the absolute value of X")
119    (quotient (lambda (n1 n2) n) "integer division")
120    (remainder (lambda (n1 n2) n) "same sign as N1")
121    (modulo (lambda (n1 n2) n) "same sign as N2")
122    (gcd (lambda (n1 |...|) n) "greatest common divisor")
123    (lcm (lambda (n2 |...|) n) "least common multiple")
124    (numerator (lambda (rational) n))
125    (denominator (lambda (rational) n))
126    (floor (lambda (x) n) "largest integer not larger than X")
127    (ceiling (lambda (x) n) "smallest integer not smaller than X")
128    (truncate (lambda (x) n) "drop fractional part")
129    (round (lambda (x) n) "round to even (banker's rounding)")
130    (rationalize (lambda (x y) n) "rational number differing from X by at most Y")
131    (exp (lambda (z) z) "e^Z")
132    (log (lambda (z) z) "natural logarithm of Z")
133    (sin (lambda (z) z) "sine function")
134    (cos (lambda (z) z) "cosine function")
135    (tan (lambda (z) z) "tangent function")
136    (asin (lambda (z) z) "arcsine function")
137    (acos (lambda (z) z) "arccosine function")
138    (atan (lambda (z) z) "arctangent function")
139    (sqrt (lambda (z) z) "principal square root of Z")
140    (expt (lambda (z1 z2) z) "returns Z1 raised to the Z2 power")
141    (make-rectangular (lambda (x1 x2) z) "create a complex number")
142    (make-polar (lambda (x1 x2) z) "create a complex number")
143    (real-part (lambda (z) x))
144    (imag-part (lambda (z) x))
145    (magnitude (lambda (z) x))
146    (angle (lambda (z) x))
147    (exact->inexact (lambda (z) z))
148    (inexact->exact (lambda (z) z))
149    (number->string (lambda (z :optional radix) str))
150    (string->number (lambda (str :optional radix) z))
151    (pair? (lambda (obj) bool) "returns #t iff OBJ is a pair")
152    (cons (lambda (obj1 obj2) pair) "create a newly allocated pair")
153    (car (lambda (pair) obj))
154    (cdr (lambda (pair) obj))
155    (set-car! (lambda (pair obj) undefined))
156    (set-cdr! (lambda (pair obj) undefined))
157    (caar (lambda (pair) obj))
158    (cadr (lambda (pair) obj))
159    (cdar (lambda (pair) obj))
160    (cddr (lambda (pair) obj))
161    (caaar (lambda (pair) obj))
162    (caadr (lambda (pair) obj))
163    (cadar (lambda (pair) obj))
164    (caddr (lambda (pair) obj))
165    (cdaar (lambda (pair) obj))
166    (cdadr (lambda (pair) obj))
167    (cddar (lambda (pair) obj))
168    (cdddr (lambda (pair) obj))
169    (caaaar (lambda (pair) obj))
170    (caaadr (lambda (pair) obj))
171    (caadar (lambda (pair) obj))
172    (caaddr (lambda (pair) obj))
173    (cadaar (lambda (pair) obj))
174    (cadadr (lambda (pair) obj))
175    (caddar (lambda (pair) obj))
176    (cadddr (lambda (pair) obj))
177    (cdaaar (lambda (pair) obj))
178    (cdaadr (lambda (pair) obj))
179    (cdadar (lambda (pair) obj))
180    (cdaddr (lambda (pair) obj))
181    (cddaar (lambda (pair) obj))
182    (cddadr (lambda (pair) obj))
183    (cdddar (lambda (pair) obj))
184    (cddddr (lambda (pair) obj))
185    (null? (lambda (obj) bool) "returns #t iff OBJ is the empty list")
186    (list? (lambda (obj) bool) "returns #t iff OBJ is a proper list")
187    (list (lambda (obj |...|) list) "returns a newly allocated list")
188    (length (lambda (list) n))
189    (append (lambda (list |...|) list) "concatenates the list arguments")
190    (reverse (lambda (list) list))
191    (list-tail (lambda (list k) list) "returns the Kth cdr of LIST")
192    (list-ref (lambda (list k) obj) "returns the Kth element of LIST")
193    (memq (lambda (obj list)) "the sublist of LIST whose car is eq? to OBJ")
194    (memv (lambda (obj list)) "the sublist of LIST whose car is eqv? to OBJ")
195    (member (lambda (obj list)) "the sublist of LIST whose car is equal? to OBJ")
196    (assq (lambda (obj list)) "the element of LIST whose car is eq? to OBJ")
197    (assv (lambda (obj list)) "the element of LIST whose car is eqv? to OBJ")
198    (assoc (lambda (obj list)) "the element of LIST whose car is equal? to OBJ")
199    (symbol? (lambda (obj) bool) "returns #t iff OBJ is a symbol")
200    (symbol->string (lambda (symbol) str))
201    (string->symbol (lambda (str) symbol))
202    (char? (lambda (obj) bool) "returns #t iff OBJ is a character")
203    (char=? (lambda (ch1 ch2) bool))
204    (char<? (lambda (ch1 ch2) bool))
205    (char>? (lambda (ch1 ch2) bool))
206    (char<=? (lambda (ch1 ch2) bool))
207    (char>=? (lambda (ch1 ch2) bool))
208    (char-ci=? (lambda (ch1 ch2) bool))
209    (char-ci<? (lambda (ch1 ch2) bool))
210    (char-ci>? (lambda (ch1 ch2) bool))
211    (char-ci<=? (lambda (ch1 ch2) bool))
212    (char-ci>=? (lambda (ch1 ch2) bool))
213    (char-alphabetic? (lambda (ch) bool))
214    (char-numeric? (lambda (ch) bool))
215    (char-whitespace? (lambda (ch) bool))
216    (char-upper-case? (lambda (ch) bool))
217    (char-lower-case? (lambda (ch) bool))
218    (char->integer (lambda (ch) int))
219    (integer->char (lambda (int) ch))
220    (char-upcase (lambda (ch) ch))
221    (char-downcase (lambda (ch) ch))
222    (string? (lambda (obj) bool) "returns #t iff OBJ is a string")
223    (make-string (lambda (k :optional ch) str) "a new string of length k")
224    (string (lambda (ch |...|) str) "a new string made of the char arguments")
225    (string-length (lambda (str) n) "the number of characters in STR")
226    (string-ref (lambda (str i) ch) "the Ith character of STR")
227    (string-set! (lambda (str i ch) undefined) "set the Ith character of STR to CH")
228    (string=? (lambda (str1 str2) bool))
229    (string-ci=? (lambda (str1 str2) bool))
230    (string<? (lambda (str1 str2) bool))
231    (string>? (lambda (str1 str2) bool))
232    (string<=? (lambda (str1 str2) bool))
233    (string>=? (lambda (str1 str2) bool))
234    (string-ci<? (lambda (str1 str2) bool))
235    (string-ci>? (lambda (str1 str2) bool))
236    (string-ci<=? (lambda (str1 str2) bool))
237    (string-ci>=? (lambda (str1 str2) bool))
238    (substring (lambda (str start end) str))
239    (string-append (lambda (str |...|) str) "concatenate the string arguments")
240    (string->list (lambda (str) list))
241    (list->string (lambda (list) str))
242    (string-copy (lambda (str) str))
243    (string-fill! (lambda (str ch) undefined) "set every char in STR to CH")
244    (vector? (lambda (obj) bool) "returns #t iff OBJ is a vector")
245    (make-vector (lambda (len :optional fill) vec) "a new vector of K elements")
246    (vector (lambda (obj |...|) vec))
247    (vector-length (lambda (vec) n) "the number of elements in VEC")
248    (vector-ref (lambda (vec i) obj) "the Ith element of VEC")
249    (vector-set! (lambda (vec i obj) undefined) "set the Ith element of VEC to OBJ")
250    (vector->list (lambda (vec) list))
251    (list->vector (lambda (list) vec))
252    (vector-fill! (lambda (vec obj) undefined) "set every element in VEC to OBJ")
253    (procedure? (lambda (obj) bool) "returns #t iff OBJ is a procedure")
254    (apply (lambda (proc obj |...|) obj) "procedure application")
255    (map (lambda (proc list) list) "a new list of PROC applied to every element of LIST")
256    (for-each (lambda (proc list)) "apply PROC to each element of LIST in order")
257    (force (lambda (promise) obj) "force the delayed value of PROMISE")
258    (call-with-current-continuation (lambda (proc) obj) "goto on steroids")
259    (values (lambda (obj |...|)) "send multiple values to the calling continuation")
260    (call-with-values (lambda (producer consumer) obj))
261    (dynamic-wind (lambda (before-thunk thunk after-thunk) obj))
262    (scheme-report-environment (lambda (int) env) "INT should be 5")
263    (null-environment (lambda (int) env) "INT should be 5")
264    (call-with-input-file (lambda (path proc) input-port))
265    (call-with-output-file (lambda (path proc) output-port))
266    (input-port? (lambda (obj) bool) "returns #t iff OBJ is an input port")
267    (output-port? (lambda (obj) bool) "returns #t iff OBJ is an output port")
268    (current-input-port (lambda () input-port) "the default input for read procedures")
269    (current-output-port (lambda () output-port) "the default output for write procedures")
270    (with-input-from-file (lambda (path thunk) obj))
271    (with-output-to-file (lambda (path thunk) obj))
272    (open-input-file (lambda (path) input-port))
273    (open-output-file (lambda (path) output-port))
274    (close-input-port (lambda (input-port)))
275    (close-output-port (lambda (output-port)))
276    (read (lambda (:optional input-port) obj) "read a datum")
277    (read-char (lambda (:optional input-port) ch) "read a single character")
278    (peek-char (lambda (:optional input-port) ch))
279    (eof-object? (lambda (obj) bool) "returns #t iff OBJ is the end-of-file object")
280    (char-ready? (lambda (:optional input-port) bool))
281    (write (lambda (object :optional output-port) undefined) "write a datum")
282    (display (lambda (object :optional output-port) undefined) "display")
283    (newline (lambda (:optional output-port) undefined) "send a linefeed")
284    (write-char (lambda (char :optional output-port) undefined) "write a single character")
285    (load (lambda (filename) undefined) "evaluate expressions from a file")
286    (eval (lambda (expr env)))
287  ))
288
289(defvar *scheme-srfi-info*
290  [
291   ;; SRFI 0
292   ("Feature-based conditional expansion construct"
293    (cond-expand (syntax (clause |...|))))
294   
295   ;; SRFI 1
296   ("List Library"
297    (xcons (lambda (object object) pair))
298    (cons* (lambda (object |...|) pair))
299    (make-list (lambda (integer :optional object) list))
300    (list-tabulate (lambda (integer procedure) list))
301    (list-copy (lambda (list) list))
302    (circular-list (lambda (object |...|) list))
303    (iota (lambda (integer :optional integer integer) list))
304    (proper-list? (lambda (object) bool))
305    (circular-list? (lambda (object) bool))
306    (dotted-list? (lambda (object) bool))
307    (not-pair? (lambda (object) bool))
308    (null-list? (lambda (object) bool))
309    (list= (lambda (procedure list |...|) bool))
310    (first (lambda (pair)))
311    (second (lambda (pair)))
312    (third (lambda (pair)))
313    (fourth (lambda (pair)))
314    (fifth (lambda (pair)))
315    (sixth (lambda (pair)))
316    (seventh (lambda (pair)))
317    (eighth (lambda (pair)))
318    (ninth (lambda (pair)))
319    (tenth (lambda (pair)))
320    (car+cdr (lambda (pair)))
321    (take (lambda (pair integer) list))
322    (drop (lambda (pair integer) list))
323    (take-right (lambda (pair integer) list))
324    (drop-right (lambda (pair integer) list))
325    (take! (lambda (pair integer) list))
326    (drop-right! (lambda (pair integer) list))
327    (split-at (lambda (pair integer) list))
328    (split-at! (lambda (pair integer) list))
329    (last (lambda (pair) obj))
330    (last-pair (lambda (pair) pair))
331    (length+ (lambda (object) n))
332    (concatenate (lambda (list) list))
333    (append! (lambda (list |...|) list))
334    (concatenate! (lambda (list) list))
335    (reverse! (lambda (list) list))
336    (append-reverse (lambda (list list) list))
337    (append-reverse! (lambda (list list) list))
338    (zip (lambda (list |...|) list))
339    (unzip1 (lambda (list) list))
340    (unzip2 (lambda (list) list))
341    (unzip3 (lambda (list) list))
342    (unzip4 (lambda (list) list))
343    (unzip5 (lambda (list) list))
344    (count (lambda (procedure list |...|) n))
345    (fold (lambda (procedure object list |...|) obj))
346    (unfold (lambda (procedure procedure procedure object :optional procedure) obj))
347    (pair-fold (lambda (procedure object list |...|) obj))
348    (reduce (lambda (procedure object list |...|) obj))
349    (fold-right (lambda (procedure object list |...|) obj))
350    (unfold-right (lambda (procedure procedure procedure object :optional object) obj))
351    (pair-fold-right (lambda (procedure object list |...|) obj))
352    (reduce-right (lambda (procedure object list |...|) obj))
353    (append-map (lambda (procedure list |...|) list))
354    (append-map! (lambda (procedure list |...|) list))
355    (map! (lambda (procedure list |...|) list))
356    (pair-for-each (lambda (procedure list |...|)))
357    (filter-map (lambda (procedure list |...|) list))
358    (map-in-order (lambda (procedure list |...|) list))
359    (filter (lambda (procedure list) list))
360    (partition (lambda (procedure list) list))
361    (remove (lambda (procedure list) list))
362    (filter! (lambda (procedure list) list))
363    (partition! (lambda (procedure list) list))
364    (remove! (lambda (procedure list) list))
365    (find (lambda (procedure list) obj))
366    (find-tail (lambda (procedure list) obj))
367    (any (lambda (procedure list |...|) obj))
368    (every (lambda (procedure list |...|) obj))
369    (list-index (lambda (procedure list |...|) obj))
370    (take-while (lambda (procedure list) list))
371    (drop-while (lambda (procedure list) list))
372    (take-while! (lambda (procedure list) list))
373    (span (lambda (procedure list) list))
374    (break (lambda (procedure list) list))
375    (span! (lambda (procedure list) list))
376    (break! (lambda (procedure list) list))
377    (delete (lambda (object list :optional procedure) list))
378    (delete-duplicates (lambda (list :optional procedure) list))
379    (delete! (lambda (obj list :optional procedure) list))
380    (delete-duplicates! (lambda (list :optional procedure) list))
381    (alist-cons (lambda (obj1 obj2 alist) alist))
382    (alist-copy (lambda (alist) alist))
383    (alist-delete (lambda (obj alist) alist))
384    (alist-delete! (lambda (obj alist) alist))
385    (lset<= (lambda (procedure list |...|) bool))
386    (lset= (lambda (procedure list |...|) bool))
387    (lset-adjoin (lambda (procedure list object |...|) list))
388    (lset-union (lambda (procedure list |...|) list))
389    (lset-union! (lambda (procedure list |...|) list))
390    (lset-intersection (lambda (procedure list |...|) list))
391    (lset-intersection! (lambda (procedure list |...|) list))
392    (lset-difference (lambda (procedure list |...|) list))
393    (lset-difference! (lambda (procedure list |...|) list))
394    (lset-xor (lambda (procedure list |...|) list))
395    (lset-xor! (lambda (procedure list |...|) list))
396    (lset-diff+intersection (lambda (procedure list |...|) list))
397    (lset-diff+intersection! (lambda (procedure list |...|) list))
398
399    )
400
401   ;; SRFI 2
402   ("AND-LET*: an AND with local bindings, a guarded LET* special form"
403    (and-let* (syntax (bindings body |...|))))
404
405   ()
406
407   ;; SRFI 4
408   ("Homogeneous numeric vector datatypes"
409
410    (u8vector? (lambda (obj) bool))
411    (make-u8vector (lambda (size integer) u8vector))
412    (u8vector (lambda (integer |...|) u8vector))
413    (u8vector-length (lambda (u8vector) n))
414    (u8vector-ref (lambda (u8vector i) int))
415    (u8vector-set! (lambda (u8vector i u8value) undefined))
416    (u8vector->list (lambda (u8vector) list))
417    (list->u8vector (lambda (list) u8vector))
418
419    (s8vector? (lambda (obj) bool))
420    (make-s8vector (lambda (size integer) s8vector))
421    (s8vector (lambda (integer |...|) s8vector))
422    (s8vector-length (lambda (s8vector) n))
423    (s8vector-ref (lambda (s8vector i) int))
424    (s8vector-set! (lambda (s8vector i s8value) undefined))
425    (s8vector->list (lambda (s8vector) list))
426    (list->s8vector (lambda (list) s8vector))
427
428    (u16vector? (lambda (obj) bool))
429    (make-u16vector (lambda (size integer) u16vector))
430    (u16vector (lambda (integer |...|)))
431    (u16vector-length (lambda (u16vector) n))
432    (u16vector-ref (lambda (u16vector i) int))
433    (u16vector-set! (lambda (u16vector i u16value) undefined))
434    (u16vector->list (lambda (u16vector) list))
435    (list->u16vector (lambda (list) u16vector))
436
437    (s16vector? (lambda (obj) bool))
438    (make-s16vector (lambda (size integer) s16vector))
439    (s16vector (lambda (integer |...|) s16vector))
440    (s16vector-length (lambda (s16vector) n))
441    (s16vector-ref (lambda (s16vector i) int))
442    (s16vector-set! (lambda (s16vector i s16value) undefined))
443    (s16vector->list (lambda (s16vector) list))
444    (list->s16vector (lambda (list) s16vector))
445
446    (u32vector? (lambda (obj) bool))
447    (make-u32vector (lambda (size integer) u32vector))
448    (u32vector (lambda (integer |...|) u32vector))
449    (u32vector-length (lambda (u32vector) n))
450    (u32vector-ref (lambda (u32vector i) int))
451    (u32vector-set! (lambda (u32vector i u32value) undefined))
452    (u32vector->list (lambda (u32vector) list))
453    (list->u32vector (lambda (list) u32vector))
454
455    (s32vector? (lambda (obj) bool))
456    (make-s32vector (lambda (size integer) s32vector))
457    (s32vector (lambda (integer |...|) s32vector))
458    (s32vector-length (lambda (s32vector) n))
459    (s32vector-ref (lambda (s32vector i) int))
460    (s32vector-set! (lambda (s32vector i s32value) undefined))
461    (s32vector->list (lambda (s32vector) list))
462    (list->s32vector (lambda (list) s32vector))
463
464    (u64vector? (lambda (obj) bool))
465    (make-u64vector (lambda (size integer) u64vector))
466    (u64vector (lambda (integer |...|) u64vector))
467    (u64vector-length (lambda (u64vector) n))
468    (u64vector-ref (lambda (u64vector i) int))
469    (u64vector-set! (lambda (u64vector i u64value) undefined))
470    (u64vector->list (lambda (u64vector) list))
471    (list->u64vector (lambda (list) u64vector))
472
473    (s64vector? (lambda (obj) bool))
474    (make-s64vector (lambda (size integer) s64vector))
475    (s64vector (lambda (integer |...|) s64vector))
476    (s64vector-length (lambda (s64vector) n))
477    (s64vector-ref (lambda (s64vector i) int))
478    (s64vector-set! (lambda (s64vector i s64value) undefined))
479    (s64vector->list (lambda (s64vector) list))
480    (list->s64vector (lambda (list) s64vector))
481
482    (f32vector? (lambda (obj) bool))
483    (make-f32vector (lambda (size integer) f32vector))
484    (f32vector (lambda (number |...|) f32vector))
485    (f32vector-length (lambda (f32vector) n))
486    (f32vector-ref (lambda (f32vector i) int))
487    (f32vector-set! (lambda (f32vector i f32value) undefined))
488    (f32vector->list (lambda (f32vector) list))
489    (list->f32vector (lambda (list) f32vector))
490
491    (f64vector? (lambda (obj) bool))
492    (make-f64vector (lambda (size integer) f64vector))
493    (f64vector (lambda (number |...|) f64vector))
494    (f64vector-length (lambda (f64vector) n))
495    (f64vector-ref (lambda (f64vector i) int))
496    (f64vector-set! (lambda (f64vector i f64value) undefined))
497    (f64vector->list (lambda (f64vector) list))
498    (list->f64vector (lambda (list) f64vector))
499    )
500
501   ;; SRFI 5
502   ("A compatible let form with signatures and rest arguments"
503    (let (syntax (bindings body |...|))))
504
505   ;; SRFI 6
506   ("Basic String Ports"
507    (open-input-string (lambda (str) input-port))
508    (open-output-string (lambda () output-port))
509    (get-output-string (lambda (output-port) str)))
510
511   ;; SRFI 7
512   ("Feature-based program configuration language"
513    (program (syntax (clause |...|)))
514    (feature-cond (syntax (clause))))
515
516   ;; SRFI 8
517   ("receive: Binding to multiple values"
518    (receive (syntax (identifiers producer body |...|))))
519
520   ;; SRFI 9
521   ("Defining Record Types"
522    (define-record-type (syntax (name constructor-name pred-name fields |...|))))
523
524   ;; SRFI 10
525   ("Sharp-Comma External Form"
526    (define-reader-ctor (syntax (name proc) undefined)))
527
528   ;; SRFI 11
529   ("Syntax for receiving multiple values"
530    (let-values (syntax (bindings body |...|)))
531    (let-values* (syntax (bindings body |...|))))
532
533   ()
534
535   ;; SRFI 13
536   ("String Library"
537    (string-map (lambda (proc s :optional start end) s))
538    (string-map! (lambda (proc s :optional start end) undefined))
539    (string-fold (lambda (kons knil s :optional start end) obj))
540    (string-fold-right (lambda (kons knil s :optional start end) obj))
541    (string-unfold (lambda (p f g seed :optional base make-final) str))
542    (string-unfold-right (lambda (p f g seed :optional base make-final) str))
543    (string-tabulate (lambda (proc len) str))
544    (string-for-each (lambda (proc s :optional start end)))
545    (string-for-each-index (lambda (proc s :optional start end)))
546    (string-every (lambda (pred s :optional start end) obj))
547    (string-any (lambda (pred s :optional start end) obj))
548    (string-hash (lambda (s :optional bound start end) int))
549    (string-hash-ci (lambda (s :optional bound start end) int))
550    (string-compare (lambda (string1 string2 lt-proc eq-proc gt-proc :optional start end) obj))
551    (string-compare-ci (lambda (string1 string2 lt-proc eq-proc gt-proc :optional start end) obj))
552    (string= (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
553    (string<> (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
554    (string< (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
555    (string> (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
556    (string<= (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
557    (string>= (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
558    (string-ci= (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
559    (string-ci<> (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
560    (string-ci< (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
561    (string-ci> (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
562    (string-ci<= (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
563    (string-ci>= (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
564    (string-titlecase (lambda (string :optional start end) str))
565    (string-upcase (lambda (string :optional start end) str))
566    (string-downcase (lambda (string :optional start end) str))
567    (string-titlecase! (lambda (string :optional start end)))
568    (string-upcase! (lambda (string :optional start end)))
569    (string-downcase! (lambda (string :optional start end)))
570    (string-take (lambda (string nchars) str))
571    (string-drop (lambda (string nchars) str))
572    (string-take-right (lambda (string nchars) str))
573    (string-drop-right (lambda (string nchars) str))
574    (string-pad (lambda (string k :optional char start end) str))
575    (string-pad-right (lambda (string k :optional char start end) str))
576    (string-trim (lambda (string :optional char/char-set/pred start end) str))
577    (string-trim-right (lambda (string :optional char/char-set/pred start end) str))
578    (string-trim-both (lambda (string :optional char/char-set/pred start end) str))
579    (string-filter (lambda (char/char-set/pred string :optional start end) str))
580    (string-delete (lambda (char/char-set/pred string :optional start end) str))
581    (string-index (lambda (string char/char-set/pred :optional start end) obj))
582    (string-index-right (lambda (string char/char-set/pred :optional end start) obj))
583    (string-skip (lambda (string char/char-set/pred :optional start end) str))
584    (string-skip-right (lambda (string char/char-set/pred :optional end start) str))
585    (string-count (lambda (string char/char-set/pred :optional start end) n))
586    (string-prefix-length (lambda (string1 string2 :optional start1 end1 start2 end2) n))
587    (string-suffix-length (lambda (string1 string2 :optional start1 end1 start2 end2) n))
588    (string-prefix-length-ci (lambda (string1 string2 :optional start1 end1 start2 end2) n))
589    (string-suffix-length-ci (lambda (string1 string2 :optional start1 end1 start2 end2) n))
590    (string-prefix? (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
591    (string-suffix? (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
592    (string-prefix-ci? (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
593    (string-suffix-ci? (lambda (string1 string2 :optional start1 end1 start2 end2) bool))
594    (string-contains (lambda (string pattern :optional s-start s-end p-start p-end) obj))
595    (string-contains-ci (lambda (string pattern :optional s-start s-end p-start p-end) obj))
596    (string-fill! (lambda (string char :optional start end) undefined))
597    (string-copy! (lambda (to tstart from :optional fstart fend)))
598    (string-copy (lambda (s :optional start end) str))
599    (substring/shared (lambda (s start :optional end) str))
600    (string-reverse (lambda (s :optional start end) str))
601    (string-reverse! (lambda (s :optional start end)))
602    (reverse-list->string (lambda (char-list) str))
603    (string->list (lambda (s :optional start end) list))
604    (string-concatenate (lambda (string-list) str))
605    (string-concatenate/shared (lambda (string-list) str))
606    (string-append/shared (lambda (s |...|) str))
607    (string-concatenate-reverse (lambda (string-list :optional final-string end) str))
608    (string-concatenate-reverse/shared (lambda (string-list :optional final-string end) str))
609    (xsubstring (lambda (s from :optional to start end) str))
610    (string-xcopy! (lambda (target tstart s from :optional to start end)))
611    (string-null? (lambda (s) bool))
612    (string-join (lambda (string-list :optional delim grammar) str))
613    (string-tokenize (lambda (string :optional token-chars start end) str))
614    (string-replace (lambda (s1 s2 start1 end1 :optional start2 end2) str))
615    (string-kmp-partial-search (lambda (pat rv s i :optional c= p-start s-start s-end) n))
616    (make-kmp-restart-vector (lambda (s :optional c= start end) vec))
617    (kmp-step (lambda (pat rv c i c= p-start) n))
618    )
619
620   ;; SRFI 14
621   ("Character-Set Library"
622    (char-set? (lambda (cset) bool))
623    (char-set= (lambda (cset |...|) bool))
624    (char-set<= (lambda (cset |...|) bool))
625    (char-set-hash (lambda (cset :optional int) int))
626    (char-set-cursor (lambda (cset) cursor))
627    (char-set-ref (lambda (cset cursor) ch))
628    (char-set-cursor-next (lambda (cset cursor) int))
629    (end-of-char-set? (lambda (cursor) bool))
630    (char-set-fold (lambda (proc obj cset) obj))
631    (char-set-unfold (lambda (proc proc proc obj :optional obj) cset))
632    (char-set-unfold! (lambda (proc proc proc obj obj) cset))
633    (char-set-for-each (lambda (proc cset)))
634    (char-set-map (lambda (proc cset) cset))
635    (char-set-copy (lambda (cset) cset))
636    (char-set (lambda (ch |...|) cset))
637    (list->char-set (lambda (list :optional obj) cset))
638    (list->char-set! (lambda (list cset) cset))
639    (string->char-set (lambda (str :optional cset) cset))
640    (string->char-set! (lambda (str cset) cset))
641    (ucs-range->char-set (lambda (int int :optional bool cset) cset))
642    (ucs-range->char-set! (lambda (int int bool cset) cset))
643    (char-set-filter (lambda (proc cset :optional base-cset) cset))
644    (char-set-filter! (lambda (proc cset base-cset) cset))
645    (->char-set (lambda (obj) cset))
646    (char-set-size (lambda (cset) n))
647    (char-set-count (lambda (proc cset) n))
648    (char-set-contains? (lambda (cset ch) bool))
649    (char-set-every (lambda (proc cset) obj))
650    (char-set-any (lambda (proc cset) obj))
651    (char-set-adjoin (lambda (cset ch |...|) cset))
652    (char-set-delete (lambda (cset ch |...|) cset))
653    (char-set-adjoin! (lambda (cset ch |...|) cset))
654    (char-set-delete! (lambda (cset ch |...|) cset))
655    (char-set->list (lambda (cset) list))
656    (char-set->string (lambda (cset) str))
657    (char-set-complement (lambda (cset) cset))
658    (char-set-union (lambda (cset |...|) cset))
659    (char-set-intersection (lambda (cset |...|) cset))
660    (char-set-xor (lambda (cset |...|) cset))
661    (char-set-difference (lambda (cset |...|) cset))
662    (char-set-diff+intersection (lambda (cset |...|) cset))
663    (char-set-complement! (lambda (cset) cset))
664    (char-set-union! (lambda (cset |...|) cset))
665    (char-set-intersection! (lambda (cset |...|) cset))
666    (char-set-xor! (lambda (cset |...|) cset))
667    (char-set-difference! (lambda (cset |...|) cset))
668    (char-set-diff+intersection! (lambda (cset |...|) cset))
669    (char-set:lower-case char-set)
670    (char-set:upper-case char-set)
671    (char-set:letter char-set)
672    (char-set:digit char-set)
673    (char-set:letter+digit char-set)
674    (char-set:graphic char-set)
675    (char-set:printing char-set)
676    (char-set:whitespace char-set)
677    (char-set:blank char-set)
678    (char-set:iso-control char-set)
679    (char-set:punctuation char-set)
680    (char-set:symbol char-set)
681    (char-set:hex-digit char-set)
682    (char-set:ascii char-set)
683    (char-set:empty char-set)
684    (char-set:full char-set)
685    )
686
687   ()
688
689   ;; SRFI 16
690   ("Syntax for procedures of variable arity"
691    (case-lambda (syntax (clauses |...|) procedure)))
692
693   ;; SRFI 17
694   ("Generalized set!"
695    (set! (syntax (what value) undefined)))
696
697   ;; SRFI 18
698   ("Multithreading support"
699    (current-thread (lambda () thread))
700    (thread? (lambda (obj) bool))
701    (make-thread (lambda (thunk :optional name) thread))
702    (thread-name (lambda (thread) name))
703    (thread-specific (lambda (thread)))
704    (thread-specific-set! (lambda (thread obj)))
705    (thread-base-priority (lambda (thread)))
706    (thread-base-priority-set! (lambda (thread number)))
707    (thread-priority-boost (lambda (thread)))
708    (thread-priority-boost-set! (lambda (thread number)))
709    (thread-quantum (lambda (thread)))
710    (thread-quantum-set! (lambda (thread number)))
711    (thread-start! (lambda (thread)))
712    (thread-yield! (lambda ()))
713    (thread-sleep! (lambda (number)))
714    (thread-terminate! (lambda (thread)))
715    (thread-join! (lambda (thread :optional timeout timeout-val)))
716    (mutex? (lambda (obj) bool))
717    (make-mutex (lambda (:optional name) mutex))
718    (mutex-name (lambda (mutex) name))
719    (mutex-specific (lambda (mutex)))
720    (mutex-specific-set! (lambda (mutex obj)))
721    (mutex-state (lambda (mutex)))
722    (mutex-lock! (lambda (mutex :optional timeout thread)))
723    (mutex-unlock! (lambda (mutex :optional condition-variable timeout)))
724    (condition-variable? (lambda (obj) bool))
725    (make-condition-variable (lambda (:optional name) condition-variable))
726    (condition-variable-name (lambda (condition-variable) name))
727    (condition-variable-specific (lambda (condition-variable)))
728    (condition-variable-specific-set! (lambda (condition-variable obj)))
729    (condition-variable-signal! (lambda (condition-variable)))
730    (condition-variable-broadcast! (lambda (condition-variable)))
731    (current-time (lambda () time))
732    (time? (lambda (obj) bool))
733    (time->seconds (lambda (time) x))
734    (seconds->time (lambda (x) time))
735    (current-exception-handler (lambda () handler))
736    (with-exception-handler (lambda (handler thunk)))
737    (raise (lambda (obj)))
738    (join-timeout-exception? (lambda (obj) bool))
739    (abandoned-mutex-exception? (lambda (obj) bool))
740    (terminated-thread-exception? (lambda (obj) bool))
741    (uncaught-exception? (lambda (obj) bool))
742    (uncaught-exception-reason (lambda (exc) obj))
743    )
744
745   ;; SRFI 19
746   ("Time Data Types and Procedures"
747    (current-date (lambda (:optional tz-offset)) date)
748    (current-julian-day (lambda ()) jdn)
749    (current-modified-julian-day (lambda ()) mjdn)
750    (current-time (lambda (:optional time-type)) time)
751    (time-resolution (lambda (:optional time-type)) nanoseconds)
752    (make-time (lambda (type nanosecond second)))
753    (time? (lambda (obj)))
754    (time-type (lambda (time)))
755    (time-nanosecond (lambda (time)))
756    (time-second (lambda (time)))
757    (set-time-type! (lambda (time)))
758    (set-time-nanosecond! (lambda (time)))
759    (set-time-second! (lambda (time)))
760    (copy-time (lambda (time)))
761    (time<=? (lambda (time1 time2)))
762    (time<? (lambda (time1 time2)))
763    (time=? (lambda (time1 time2)))
764    (time>=? (lambda (time1 time2)))
765    (time>? (lambda (time1 time2)))
766    (time-difference (lambda (time1 time2)))
767    (time-difference! (lambda (time1 time2)))
768    (add-duration (lambda (time duration)))
769    (add-duration! (lambda (time duration)))
770    (subtract-duration (lambda (time duration)))
771    (subtract-duration! (lambda (time duration)))
772    (make-date (lambda (nanosecond second minute hour day month year zone-offset)))
773    (date? (lambda (obj)))
774    (date-nanosecond (lambda (date)))
775    (date-second (lambda (date)))
776    (date-minute (lambda (date)))
777    (date-hour (lambda (date)))
778    (date-day (lambda (date)))
779    (date-month (lambda (date)))
780    (date-year (lambda (date)))
781    (date-zone-offset (lambda (date)))
782    (date-year-day (lambda (date)))
783    (date-week-day (lambda (date)))
784    (date-week-number (lambda (date)))
785    (date->julian-day (lambda (date)))
786    (date->modified-julian-day (lambda (date)))
787    (date->time-monotonic (lambda (date)))
788    (date->time-tai (lambda (date)))
789    (date->time-utc (lambda (date)))
790    (julian-day->date (lambda (date)))
791    (julian-day->time-monotonic (lambda (date)))
792    (julian-day->time-tai (lambda (date)))
793    (julian-day->time-utc (lambda (date)))
794    (modified-julian-day->date (lambda (date)))
795    (modified-julian-day->time-monotonic (lambda (date)))
796    (modified-julian-day->time-tai (lambda (date)))
797    (modified-julian-day->time-utc (lambda (date)))
798    (time-monotonic->date (lambda (date)))
799    (time-monotonic->julian-day (lambda (date)))
800    (time-monotonic->modified-julian-day (lambda (date)))
801    (time-monotonic->time-monotonic (lambda (date)))
802    (time-monotonic->time-tai (lambda (date)))
803    (time-monotonic->time-tai! (lambda (date)))
804    (time-monotonic->time-utc (lambda (date)))
805    (time-monotonic->time-utc! (lambda (date)))
806    (time-tai->date (lambda (date)))
807    (time-tai->julian-day (lambda (date)))
808    (time-tai->modified-julian-day (lambda (date)))
809    (time-tai->time-monotonic (lambda (date)))
810    (time-tai->time-monotonic! (lambda (date)))
811    (time-tai->time-utc (lambda (date)))
812    (time-tai->time-utc! (lambda (date)))
813    (time-utc->date (lambda (date)))
814    (time-utc->julian-day (lambda (date)))
815    (time-utc->modified-julian-day (lambda (date)))
816    (time-utc->time-monotonic (lambda (date)))
817    (time-utc->time-monotonic! (lambda (date)))
818    (time-utc->time-tai (lambda (date)))
819    (time-utc->time-tai! (lambda (date)))
820    (date->string (lambda (date :optional format-string)))
821    (string->date (lambda (input-string template-string)))
822    )
823
824   ()
825
826   ;; SRFI 21
827   ("Real-time multithreading support"
828    srfi-18)                            ; same as srfi-18
829
830   ;; SRFI 22
831   ("Running Scheme Scripts on Unix"
832    )
833
834   ;; SRFI 23
835   ("Error reporting mechanism"
836    (error (lambda (reason-string arg |...|))))
837
838   ()
839
840   ;; SRFI 25
841   ("Multi-dimensional Array Primitives"
842    (array? (lambda (obj)))
843    (make-array (lambda (shape :optional init)))
844    (shape (lambda (bound |...|)))
845    (array (lambda (shape obj |...|)))
846    (array-rank (lambda (array)))
847    (array-start (lambda (array)))
848    (array-end (lambda (array)))
849    (array-shape (lambda (array)))
850    (array-ref (lambda (array i |...|)))
851    (array-set! (lambda (array obj |...|) undefined))
852    (share-array (lambda (array shape proc)))
853    )
854
855   ;; SRFI 26
856   ("Notation for Specializing Parameters without Currying"
857    (cut (syntax (obj |...|)))
858    (cute (lambda (obj |...|))))
859
860   ;; SRFI 27
861   ("Sources of Random Bits"
862    (random-integer (lambda (n)))
863    (random-real (lambda ()))
864    (default-random-source (lambda ()))
865    (make-random-source (lambda ()))
866    (random-source? (lambda (obj)))
867    (random-source-state-ref (lambda (random-source)))
868    (random-source-state-set! (lambda (random-source state)))
869    (random-source-randomize! (lambda (random-source)))
870    (random-source-pseudo-randomize! (lambda (random-source i j)))
871    (random-source-make-integers (lambda (random-source)))
872    (random-source-make-reals (lambda (random-source)))
873    )
874
875   ;; SRFI 28
876   ("Basic Format Strings"
877    (format (lambda (port-or-boolean format-string arg |...|))))
878
879   ;; SRFI 29
880   ("Localization"
881    (current-language (lambda (:optional symbol)))
882    (current-country (lambda (:optional symbol)))
883    (current-locale-details (lambda (:optional list)))
884    (declare-bundle! (lambda (bundle-name association-list)))
885    (store-bundle (lambda (bundle-name)))
886    (load-bundle! (lambda (bundle-name)))
887    (localized-template (lambda (package-name message-template-name)))
888    )
889
890   ;; SRFI 30
891   ("Nested Multi-line Comments"
892    )
893
894   ;; SRFI 31
895   ("A special form for recursive evaluation"
896    (rec (syntax (name body |...|) procedure)))
897
898   ()
899
900   ()
901
902   ;; SRFI 34
903   ("Exception Handling for Programs"
904    (guard (syntax (clauses |...|)))
905    (raise (lambda (obj)))
906    )
907
908   ;; SRFI 35
909   ("Conditions"
910    (make-condition-type (lambda (id parent field-name-list)))
911    (condition-type? (lambda (obj)))
912    (make-condition (lambda (condition-type)))
913    (condition? (lambda (obj)))
914    (condition-has-type? (lambda (condition condition-type)))
915    (condition-ref (lambda (condition field-name)))
916    (make-compound-condition (lambda (condition |...|)))
917    (extract-condition (lambda (condition condition-type)))
918    (define-condition-type (syntax (name parent pred-name fields |...|)))
919    (condition (syntax (type-field-binding |...|)))
920    )
921
922   ;; SRFI 36
923   ("I/O Conditions"
924    (&error condition)
925    (&i/o-error condition)
926    (&i/o-port-error condition)
927    (&i/o-read-error condition)
928    (&i/o-write-error condition)
929    (&i/o-closed-error condition)
930    (&i/o-filename-error condition)
931    (&i/o-malformed-filename-error condition)
932    (&i/o-file-protection-error condition)
933    (&i/o-file-is-read-only-error condition)
934    (&i/o-file-already-exists-error condition)
935    (&i/o-no-such-file-error condition)
936    )
937
938   ;; SRFI 37
939   ("args-fold: a program argument processor"
940    (args-fold
941     (arg-list option-list unrecognized-option-proc operand-proc seed |...|))
942    (option-processor (lambda (option name arg seeds |...|)))
943    (operand-processor (lambda (operand seeds |...|)))
944    (option (lambda (name-list required-arg? optional-arg? option-proc)))
945    (option-names (lambda (option)))
946    (option-required-arg? (lambda (option)))
947    (option-optional-arg? (lambda (option)))
948    (option-processor (lambda (option)))
949    )
950
951   ;; SRFI 38
952   ("External Representation for Data With Shared Structure"
953    (write-with-shared-structure (lambda (obj :optional port optarg)))
954    (read-with-shared-structure (lambda (:optional port)))
955    )
956
957   ;; SRFI 39
958   ("Parameter objects"
959    (make-parameter (lambda (init-value :optional converter)))
960    (parameterize (syntax (bindings body |...|))))
961
962   ;; SRFI 40
963   ("A Library of Streams"
964    (stream-null stream)
965    (stream-cons (syntax (obj stream)))
966    (stream? (lambda (obj)))
967    (stream-null? (lambda (obj)))
968    (stream-pair? (lambda (obj)))
969    (stream-car (lambda (stream)))
970    (stream-cdr (lambda (stream)))
971    (stream-delay (syntax (expr)))
972    (stream (lambda (obj |...|)))
973    (stream-unfoldn (lambda (generator-proc seed n)))
974    (stream-map (lambda (proc stream |...|)))
975    (stream-for-each (lambda (proc stream |...|)))
976    (stream-filter (lambda (pred stream)))
977    )
978
979   ()
980
981   ;; SRFI 42
982   ("Eager Comprehensions"
983    (list-ec (syntax))
984    (append-ec (syntax))
985    (sum-ec (syntax))
986    (min-ec (syntax))
987    (max-ec (syntax))
988    (any?-ec (syntax))
989    (every?-ec (syntax))
990    (first-ec (syntax))
991    (do-ec (syntax))
992    (fold-ec (syntax))
993    (fold3-ec (syntax))
994    (:list (syntax () undefined))
995    (:string (syntax () undefined))
996    (:vector (syntax () undefined))
997    (:integers (syntax () undefined))
998    (:range (syntax () undefined))
999    (:real-range (syntax () undefined))
1000    (:char-range (syntax () undefined))
1001    (:port (syntax () undefined))
1002    (:do (syntax () undefined))
1003    (:let (syntax () undefined))
1004    (:parallel (syntax () undefined))
1005    (:while (syntax () undefined))
1006    (:until (syntax () undefined))
1007    )
1008
1009   ;; SRFI 43
1010   ("Vector Library"
1011    (vector-unfold (f length initial-seed |...|))
1012    (vector-unfold-right (lambda (f length initial-seed |...|)))
1013    (vector-tabulate (lambda (f size)))
1014    (vector-copy (lambda (vec :optional start end fill)))
1015    (vector-reverse-copy (lambda (vec :optional start end)))
1016    (vector-append (lambda (vec |...|)))
1017    (vector-concatenate (lambda (vector-list)))
1018    (vector-empty? (lambda (obj)))
1019    (vector= (lambda (eq-proc vec |...|)))
1020    (vector-fold (lambda (kons knil vec |...|)))
1021    (vector-fold-right (lambda (kons knil vec |...|)))
1022    (vector-map (lambda (f vec |...|)))
1023    (vector-map! (lambda (f vec |...|)))
1024    (vector-for-each (lambda (f vec |...|) undefined))
1025    (vector-count (lambda (pred vec |...|)))
1026    (vector-index (lambda (pred vec |...|)))
1027    (vector-index-right (lambda (pred vec |...|)))
1028    (vector-skip (lambda (pred vec |...|)))
1029    (vector-skip-right (lambda (pred vec |...|)))
1030    (vector-binary-search (lambda (vec value cmp-proc)))
1031    (vector-any (lambda (pred vec |...|)))
1032    (vector-every (lambda (pred vec |...|)))
1033    (vector-swap! (lambda (vec i j) undefined))
1034    (vector-reverse! (lambda (vec :optional start end) undefined))
1035    (vector-copy! (lambda (target-vec t-start source-vec :optional start end) undefined))
1036    (vector-reverse-copy! (lambda (target-vec t-start source-vec :optional start end) undefined))
1037    (reverse-vector-to-list (lambda (vec :optional start end)))
1038    (reverse-list-to-vector (lambda (list)))
1039    )
1040
1041   ;; SRFI 44
1042   ("Collections"
1043    )
1044
1045   ;; SRFI 45
1046   ("Primitives for expressing iterative lazy algorithms"
1047    (delay (syntax (expr)))
1048    (lazy (syntax (expr)))
1049    (force (lambda (promise)))
1050    (eager (lambda (promise)))
1051    )
1052
1053   ;; SRFI 46
1054   ("Basic Syntax-rules Extensions"
1055    (syntax-rules (syntax () undefined)))
1056
1057   ;; SRFI 47
1058   ("Array"
1059    (make-array (lambda (prototype k |...|)))
1060    (ac64 (lambda (:optional z)))
1061    (ac32 (lambda (:optional z)))
1062    (ar64 (lambda (:optional x)))
1063    (ar32 (lambda (:optional x)))
1064    (as64 (lambda (:optional n)))
1065    (as32 (lambda (:optional n)))
1066    (as16 (lambda (:optional n)))
1067    (as8 (lambda (:optional n)))
1068    (au64 (lambda (:optional n)))
1069    (au32 (lambda (:optional n)))
1070    (au16 (lambda (:optional n)))
1071    (au8 (lambda (:optional n)))
1072    (at1 (lambda (:optional bool)))
1073    (make-shared-array (lambda (array mapper k |...|)))
1074    (array-rank (lambda (obj)))
1075    (array-dimensions (lambda (array)))
1076    (array-in-bounds? (lambda (array k |...|)))
1077    (array-ref (lambda (array k |...|)))
1078    (array-set! (lambda (array obj k |...|)))
1079    )
1080
1081   ;; SRFI 48
1082   ("Intermediate Format Strings"
1083    (format (lambda (port-or-boolean format-string arg |...|))))
1084
1085   ;; SRFI 49
1086   ("Indentation-sensitive syntax"
1087    )
1088
1089   ()
1090
1091   ;; SRFI 51
1092   ("Handling rest list"
1093    (rest-values (lambda (caller rest-list :optional args-number-limit default)))
1094    (arg-and (syntax))
1095    (arg-ands (syntax))
1096    (err-and (syntax))
1097    (err-ands (syntax))
1098    (arg-or (syntax))
1099    (arg-ors (syntax))
1100    (err-or (syntax))
1101    (err-ors (syntax))
1102    )
1103
1104   ()
1105
1106   ()
1107
1108   ;; SRFI 54
1109   ("Formatting"
1110    (cat (lambda (obj |...|))))
1111
1112   ;; SRFI 55
1113   ("require-extension"
1114    (require-extension (syntax)))
1115
1116   ()
1117
1118   ;; SRFI 57
1119   ("Records"
1120    (define-record-type (syntax))
1121    (define-record-scheme (syntax))
1122    (record-update (syntax))
1123    (record-update! (syntax))
1124    (record-compose (syntax)))
1125
1126   ;; SRFI 58
1127   ("Array Notation"
1128    )
1129
1130   ;; SRFI 59
1131   ("Vicinity"
1132    (program-vicinity (lambda ()))
1133    (library-vicinity (lambda ()))
1134    (implementation-vicinity (lambda ()))
1135    (user-vicinity (lambda ()))
1136    (home-vicinity (lambda ()))
1137    (in-vicinity (lambda (vicinity filename)))
1138    (sub-vicinity (lambda (vicinity name)))
1139    (make-vicinity (lambda (dirname)))
1140    (path-vicinity (lambda (path)))
1141    (vicinity:suffix? (lambda (ch)))
1142    )
1143
1144   ;; SRFI 60
1145   ("Integers as Bits"
1146    (bitwise-and (lambda (n |...|) int))
1147    (bitwise-ior (lambda (n |...|) int))
1148    (bitwise-xor (lambda (n |...|) int))
1149    (bitwise-not (lambda (n) int))
1150    (bitwise-if (lambda (mask n m) int))
1151    (any-bits-set? (lambda (n m) bool))
1152    (bit-count (lambda (n) int))
1153    (integer-length (lambda (n) int))
1154    (first-bit-set (lambda (n) int))
1155    (bit-set? (lambda (i n) bool))
1156    (copy-bit (lambda (index n bool) int))
1157    (bit-field (lambda (n start end) int))
1158    (copy-bit-field (lambda (to-int from-int start end) int))
1159    (arithmetic-shift (lambda (n count) int))
1160    (rotate-bit-field (lambda (n count start end) int))
1161    (reverse-bit-field (lambda (n start end) int))
1162    (integer->list (lambda (k :optional len) list))
1163    (list->integer (lambda (list) int))
1164    )
1165
1166   ;; SRFI 61
1167   ("A more general cond clause"
1168    (cond (syntax)))
1169
1170   ;; SRFI 62
1171   ("S-expression comments"
1172    )
1173
1174   ;; SRFI 63
1175   ("Homogeneous and Heterogeneous Arrays"
1176    )
1177
1178   ;; SRFI 64
1179   ("A Scheme API for test suites"
1180    (test-assert (syntax))
1181    (test-eqv (syntax))
1182    (test-equal (syntax))
1183    (test-eq (syntax))
1184    (test-approximate (syntax))
1185    (test-error (syntax))
1186    (test-read-eval-string (lambda (string)))
1187    (test-begin (syntax (suite-name :optional count)))
1188    (test-end (syntax (suite-name)))
1189    (test-group (syntax (suite-name decl-or-expr |...|)))
1190    (test-group-with-cleanup (syntax (suite-name decl-or-expr |...|)))
1191    (test-match-name (lambda (name)))
1192    (test-match-nth (lambda (n :optional count)))
1193    (test-match-any (lambda (specifier |...|)))
1194    (test-match-all (lambda (specifier |...|)))
1195    (test-skip (syntax (specifier)))
1196    (test-expect-fail (syntax (specifier)))
1197    (test-runner? (lambda (obj)))
1198    (test-runner-current (lambda (:optional runner)))
1199    (test-runner-get (lambda ()))
1200    (test-runner-simple (lambda ()))
1201    (test-runner-null (lambda ()))
1202    (test-runner-create (lambda ()))
1203    (test-runner-factory (lambda (:optional factory)))
1204    (test-apply (syntax (runner specifier |...|)))
1205    (test-with-runner (syntax (runner decl-or-expr |...|)))
1206    (test-result-kind (lambda (:optional runner)))
1207    (test-passed? (lambda (:optional runner)))
1208    (test-result-ref (lambda (runner prop-name (:optional default))))
1209    (test-result-set! (lambda (runner prop-name value)))
1210    (test-result-remove (lambda (runner prop-name)))
1211    (test-result-clear (lambda (runner)))
1212    (test-result-alist (lambda (runner)))
1213    (test-runner-on-test-begin (lambda (runner :optional proc)))
1214    (test-runner-on-test-begin! (lambda (runner :optional proc)))
1215    (test-runner-on-test-end (lambda (runner :optional proc)))
1216    (test-runner-on-test-end! (lambda (runner :optional proc)))
1217    (test-runner-on-group-begin (lambda (runner :optional proc)))
1218    (test-runner-on-group-begin! (lambda (runner :optional proc)))
1219    (test-runner-on-group-end (lambda (runner :optional proc)))
1220    (test-runner-on-group-end! (lambda (runner :optional proc)))
1221    (test-runner-on-bad-count (lambda (runner :optional proc)))
1222    (test-runner-on-bad-count! (lambda (runner :optional proc)))
1223    (test-runner-on-bad-end-name (lambda (runner :optional proc)))
1224    (test-runner-on-bad-end-name! (lambda (runner :optional proc)))
1225    (test-runner-on-final (lambda (runner :optional proc)))
1226    (test-runner-on-final! (lambda (runner :optional proc)))
1227    (test-runner-pass-count (lambda (runner)))
1228    (test-runner-fail-count (lambda (runner)))
1229    (test-runner-xpass-count (lambda (runner)))
1230    (test-runner-skip-count (lambda (runner)))
1231    (test-runner-test-name (lambda (runner)))
1232    (test-runner-group-path (lambda (runner)))
1233    (test-runner-group-stack (lambda (runner)))
1234    (test-runner-aux-value (lambda (runner)))
1235    (test-runner-aux-value! (lambda (runner)))
1236    (test-runner-reset (lambda (runner)))
1237    )
1238
1239   ()
1240
1241   ;; SRFI 66
1242   ("Octet Vectors"
1243    (make-u8vector (lambda (len n)))
1244    (u8vector (lambda (n |...|)))
1245    (u8vector->list (lambda (u8vector)))
1246    (list->u8vector (lambda (octet-list)))
1247    (u8vector-length u8vector)
1248    (u8vector-ref (lambda (u8vector k)))
1249    (u8vector-set! (lambda (u8vector k n)))
1250    (u8vector=? (lambda (u8vector-1 u8vector-2)))
1251    (u8vector-compare (lambda (u8vector-1 u8vector-2)))
1252    (u8vector-copy! (lambda (source source-start target target-start n)))
1253    (u8vector-copy (lambda (u8vector)))
1254    )
1255
1256   ;; SRFI 67
1257   ("Compare Procedures"
1258    )
1259
1260   ()
1261
1262   ;; SRFI 69
1263   ("Basic hash tables"
1264    )
1265
1266   ;; SRFI 70
1267   ("Numbers"
1268    )
1269
1270   ;; SRFI 71
1271   ("LET-syntax for multiple values"
1272    )
1273
1274   ;; SRFI 72
1275   ("Simple hygienic macros"
1276    )
1277
1278   ()
1279
1280   ;; SRFI 74
1281   ("Octet-Addressed Binary Blocks"
1282    )
1283
1284   ])
1285
1286(defvar *scheme-chicken-modules*
1287  '((extras
1288     (->string (lambda (obj) str))
1289     (alist->hash-table (lambda (alist) hash-table))
1290     (alist-ref (lambda (alist key :optional eq-fn default)))
1291     (alist-update! (lambda (key value alist :optional eq-fn) undefined))
1292     (atom? (lambda (obj) bool))
1293     (binary-search (lambda (vec proc)))
1294     (butlast (lambda (list) list) "drops the last element of list")
1295     (call-with-input-string (lambda (string proc)))
1296     (call-with-output-string (lambda (proc)))
1297     (chop (lambda (list k) list))
1298     (complement (lambda (f) f2))
1299     (compose (lambda (f1 f2 |...|) f))
1300     (compress (lambda (boolean-list list)))
1301     (conc (lambda (obj |...|)))
1302     (conjoin (lambda (pred |...|) pred))
1303     (constantly (lambda (obj |...|) f))
1304     (disjoin (lambda (pred |...|) pred))
1305     (each (lambda (proc |...|) proc))
1306     (flatten (lambda (list1 |...|) list))
1307     (flip (lambda (proc) proc))
1308     (format (lambda (format-string arg |...|)))
1309     (fprintf (lambda (port format-string arg |...|)))
1310     (hash (lambda (obj :optional n) int))
1311     (hash-by-identity (lambda (obj :optional n) int))
1312     (hash-table->alist (lambda (hash-table) alist))
1313     (hash-table-copy (lambda (hash-table) hash-table))
1314     (hash-table-delete! (lambda (hash-table key) undefined))
1315     (hash-table-equivalence-function (lambda (hash-table) pred))
1316     (hash-table-exists? (lambda (hash-table key) bool))
1317     (hash-table-fold (lambda (hash-table f init-value)))
1318     (hash-table-hash-function (lambda (hash-table) f))
1319     (hash-table-keys (lambda (hash-table) list))
1320     (hash-table-merge! (lambda (hash-table1 hash-table2) undefined))
1321     (hash-table-ref (lambda (hash-table key :optional thunk)))
1322     (hash-table-ref/default (lambda (hash-table key default)))
1323     (hash-table-remove! (lambda (hash-table proc) undefined))
1324     (hash-table-set! (lambda (hash-table key value) undefined))
1325     (hash-table-size (lambda (hash-table) n))
1326     (hash-table-update! (lambda (hash-table key proc :optional thunk) undefined))
1327     (hash-table-update!/default (lambda (hash-table key proc default) undefined))
1328     (hash-table-values (lambda (hash-table) list))
1329     (hash-table-walk (lambda (hash-table proc) undefined))
1330     (hash-table? (lambda (obj) bool))
1331     (identity (lambda (obj)))
1332     (intersperse (lambda (list obj) list))
1333     (join (lambda (list-of-lists :optional list) list))
1334     (list->queue (lambda (list) queue))
1335     (list-of (lambda (pred)))
1336     (make-hash-table (lambda (:optional eq-fn hash-fn size) hash-table))
1337     (make-input-port (lambda (read-proc ready?-pred close-proc :optional peek-proc) input-port))
1338     (make-output-port (lambda (write-proc close-proc :optional flush-proc) output-port))
1339     (make-queue (lambda () queue))
1340     (merge (lambda (list1 list2 less-fn) list))
1341     (merge! (lambda (list1 list2 less-fn) list))
1342     (noop (lambda (obj |...|) undefined))
1343     (pp (lambda (obj :optional output-port) undefined))
1344     (pretty-print (lambda (obj :optional output-port) undefined))
1345     (pretty-print-width (lambda (:optional new-width) n))
1346     (printf (lambda (format-string arg |...|) undefined))
1347     (project (lambda (n) proc))
1348     (queue->list (lambda (queue) list))
1349     (queue-add! (lambda (queue obj) undefined))
1350     (queue-empty? (lambda (queue) bool))
1351     (queue-first (lambda (queue)))
1352     (queue-last (lambda (queue)))
1353     (queue-push-back! (lambda (queue obj) undefined))
1354     (queue-push-back-list! (lambda (queue list) undefined))
1355     (queue-remove! (lambda (queue) undefined))
1356     (queue? (lambda (obj) bool))
1357     (random (lambda (n) n))
1358     (randomize (lambda (:optional x) undefined))
1359     (rassoc (lambda (key list :optional eq-fn)))
1360     (read-file (lambda (:optional file-or-port reader-fn max-count) str))
1361     (read-line (lambda (:optional port limit) str))
1362     (read-lines (lambda (:optional port max) list))
1363     (read-string (lambda (:optional n port) str))
1364     (read-string! (lambda (n dest :optional port start) undefined))
1365     (read-token (lambda (predicate :optional port) str))
1366     (shuffle (lambda (list) list))
1367     (sort (lambda (sequence less-fn) sequence))
1368     (sort! (lambda (sequence less-fn) sequence))
1369     (sorted? (lambda (sequence less-fn) bool))
1370     (sprintf (lambda (format-string arg |...|) str))
1371     (string-chomp (lambda (str :optional suffix-str) str))
1372     (string-chop (lambda (str length) list))
1373     (string-ci-hash (lambda (str :optional n) n))
1374     (string-compare3 (lambda (str1 str2) n))
1375     (string-compare3-ci (lambda (str1 str2) n))
1376     (string-hash (lambda (str1 :optional n) n))
1377     (string-intersperse (lambda (list :optional seperator-string) str))
1378     (string-split (lambda (str :optional delimiter-str keep-empty?) list))
1379     (string-translate (lambda (str from-str :optional to-str) str))
1380     (string-translate* (lambda (str list) str))
1381     (substring-ci=? (lambda (str1 str2 :optional start1 start2 length) str))
1382     (substring-index (lambda (which-str where-str :optional start) i))
1383     (substring-index-ci (lambda (which-str where-str :optional start) i))
1384     (substring=? (lambda (str1 str2 :optional start1 start2 length) bool))
1385     (tail? (lambda (obj list) bool))
1386     (with-error-output-to-port (lambda (output-port thunk)))
1387     (with-input-from-port (lambda (port thunk)))
1388     (with-input-from-string (lambda (str thunk)))
1389     (with-output-to-port (lambda (port thunk)))
1390     (with-output-to-string (lambda (thunk) str))
1391     (write-line (lambda (str :optional port) undefined))
1392     (write-string (lambda (str :optional num port) undefined))
1393     )
1394    (lolevel
1395     (address->pointer (lambda (n) ptr))
1396     (align-to-word (lambda (ptr-or-int) ptr))
1397     (allocate (lambda (size) block))
1398     (block-ref (lambda (block index) int))
1399     (block-set! (lambda (block index obj) undefined))
1400     (byte-vector (lambda (n |...|) byte-vector))
1401     (byte-vector->list (lambda (byte-vector) list))
1402     (byte-vector->string (lambda (byte-vector) string))
1403     (byte-vector-fill! (lambda (byte-vector n) undefined))
1404     (byte-vector-length (lambda (byte-vector) n))
1405     (byte-vector-ref (lambda (byte-vector i) int))
1406     (byte-vector-set! (lambda (byte-vector i n) undefined))
1407     (byte-vector? (lambda (obj) bool))
1408     (extend-procedure (lambda (proc x) proc))
1409     (extended-procedure? (lambda (proc) bool))
1410     (free (lambda (pointer) undefined))
1411     (global-bound? (lambda (sym) bool))
1412     (global-make-unbound! (lambda (sym) undefined))
1413     (global-ref (lambda (sym)))
1414     (global-set! (lambda (sym val) undefined))
1415     (list->byte-vector (lambda (list) byte-vector))
1416     (locative->object (lambda (locative) obj))
1417     (locative-ref (lambda (locative)))
1418     (locative-set! (lambda (locative val) undefined))
1419     (locative? (lambda (obj) bool))
1420     (make-byte-vector (lambda (size :optional init-n) byte-vector))
1421     (make-locative (lambda (obj :optional index) locative))
1422     (make-record-instance (lambda (sym arg |...|)))
1423     (make-static-byte-vector (lambda (size :optional init-n)))
1424     (make-weak-locative (lambda (obj :optional index) locative))
1425     (move-memory! (lambda (from to :optional bytes from-offset to-offset) undefined))
1426     (mutate-procedure (lambda (proc proc) proc))
1427     (null-pointer (lambda () pointer))
1428     (null-pointer? (lambda (pointer) bool))
1429     (number-of-bytes (lambda (block) int))
1430     (number-of-slots (lambda (block) int))
1431     (object->pointer (lambda (obj) ptr))
1432     (object-become! (lambda (alist) undefined))
1433     (object-copy (lambda (obj)))
1434     (object-evict (lambda (obj :optional allocator-proc)))
1435     (object-evict-to-location (lambda (obj ptr :optional limit)))
1436     (object-evicted? (lambda (obj) bool))
1437     (object-release (lambda (obj :optional releaser-proc)))
1438     (object-size (lambda (obj) int))
1439     (object-unevict (lambda (obj :optional full)))
1440     (pointer->address (lambda (ptr) n))
1441     (pointer->object (lambda (ptr)))
1442     (pointer-f32-ref (lambda (ptr) real))
1443     (pointer-f32-set! (lambda (ptr x) undefined))
1444     (pointer-f64-ref (lambda (ptr) real))
1445     (pointer-f64-set! (lambda (ptr x) undefined))
1446     (pointer-offset (lambda (ptr n) n))
1447     (pointer-s16-ref (lambda (ptr) int))
1448     (pointer-s16-set! (lambda (ptr n) undefined))
1449     (pointer-s32-ref (lambda (ptr) int))
1450     (pointer-s32-set! (lambda (ptr n) undefined))
1451     (pointer-s8-ref (lambda (ptr) int))
1452     (pointer-s8-set! (lambda (ptr n) undefined))
1453     (pointer-tag (lambda (ptr) tag))
1454     (pointer-u16-ref (lambda (ptr) int))
1455     (pointer-u16-set! (lambda (ptr n) undefined))
1456     (pointer-u32-ref (lambda (ptr) int))
1457     (pointer-u32-set! (lambda (ptr n) undefined))
1458     (pointer-u8-ref (lambda (ptr) int))
1459     (pointer-u8-set! (lambda (ptr n) undefined))
1460     (pointer=? (lambda (ptr1 ptr2) bool))
1461     (pointer? (lambda (obj) bool))
1462     (procedure-data (lambda (proc)))
1463     (record->vector (lambda (block) vector))
1464     (record-instance? (lambda (obj) bool))
1465     (set-invalid-procedure-call-handler! (lambda (proc) undefined))
1466     (set-procedure-data! (lambda (proc obj) undefined))
1467     (static-byte-vector->pointer (lambda (byte-vector) pointer))
1468     (string->byte-vector (lambda (str) byte-vector))
1469     (tag-pointer (lambda (ptr tag)))
1470     (tagged-pointer? (lambda (obj tag) bool))
1471     (unbound-variable-value (lambda (:optional value)))
1472     )
1473    (posix
1474     (_exit (lambda (:optional n) undefined))
1475     (call-with-input-pipe (lambda (cmdline-string proc :optional mode)))
1476     (call-with-output-pipe (lambda (cmdline-string proc :optional mode)))
1477     (change-directory (lambda (dir)))
1478     (change-file-mode (lambda (filename mode)))
1479     (change-file-owner (lambda (filename user-n group-n)))
1480     (close-input-pipe (lambda (input-port)))
1481     (close-output-pipe (lambda (output-port)))
1482     (create-directory (lambda (filename)))
1483     (create-fifo (lambda (filename :optional mode)))
1484     (create-pipe (lambda ()))
1485     (create-session (lambda ()))
1486     (create-symbolic-link (lambda (old-filename new-filename)))
1487     (current-directory (lambda (:optional new-dir)))
1488     (current-effective-group-id (lambda () int))
1489     (current-effective-user-id (lambda () int))
1490     (current-environment (lambda ()))
1491     (current-group-id (lambda ()))
1492     (current-process-id (lambda ()))
1493     (current-user-id (lambda ()))
1494     (delete-directory (lambda (dir)))
1495     (directory (lambda (:optional dir show-dotfiles?) list))
1496     (directory? (lambda (filename) bool))
1497     (duplicate-fileno (lambda (old-n :optional new-n)))
1498;;      (errno/acces integer)
1499;;      (errno/again integer)
1500;;      (errno/badf integer)
1501;;      (errno/busy integer)
1502;;      (errno/child integer)
1503;;      (errno/exist integer)
1504;;      (errno/fault integer)
1505;;      (errno/intr integer)
1506;;      (errno/inval integer)
1507;;      (errno/io integer)
1508;;      (errno/isdir integer)
1509;;      (errno/mfile integer)
1510;;      (errno/noent integer)
1511;;      (errno/noexec integer)
1512;;      (errno/nomem integer)
1513;;      (errno/nospc integer)
1514;;      (errno/notdir integer)
1515;;      (errno/perm integer)
1516;;      (errno/pipe integer)
1517;;      (errno/rofs integer)
1518;;      (errno/spipe integer)
1519;;      (errno/srch integer)
1520;;      (errno/wouldblock integer)
1521     (fifo? (lambda (filename) bool))
1522     (file-access-time (lambda (filename) real))
1523     (file-change-time (lambda (filename) real))
1524     (file-close (lambda (fileno)))
1525     (file-execute-access? (lambda (filename) bool))
1526     (file-link (lambda (old-filename new-filename)))
1527     (file-lock (lambda (port :optional start len)))
1528     (file-lock/blocking (lambda (port :optional start len)))
1529     (file-mkstemp (lambda (template-filename)))
1530     (file-modification-time (lambda (filename) real))
1531     (file-open (lambda (filename (flags open-mode open/binary open/excl open/fsync open/noctty open/nonblock open/rdonly open/rdwr open/read open/sync open/text) :optional mode) fd))
1532     (file-owner (lambda (filename)))
1533     (file-permissions (lambda (filename) int))
1534     (file-position (lambda (port-or-fileno) int))
1535     (file-read (lambda (fileno size :optional buffer-string)))
1536     (file-read-access? (lambda (filename) bool))
1537     (file-select (lambda (read-fd-list write-fd-list :optional timeout)))
1538     (file-size (lambda (filename) int))
1539     (file-stat (lambda (filename :optional follow-link?)))
1540     (file-test-lock (lambda (port :optional start len)))
1541     (file-truncate (lambda (filename-or-fileno offset)))
1542     (file-unlock (lambda (lock)))
1543     (file-write (lambda (fileno buffer-string :optional size)))
1544     (file-write-access? (lambda (filename)))
1545     (fileno/stderr integer)
1546     (fileno/stdin integer)
1547     (fileno/stdout integer)
1548     (find-files (lambda (dir pred :optional action-proc identity limit)))
1549     (get-groups (lambda ()))
1550     (get-host-name (lambda ()))
1551     (glob (lambda (pattern1 |...|)))
1552     (group-information (lambda (group-name-or-n)))
1553     (initialize-groups (lambda (user-name base-group-n)))
1554     (local-time->seconds (lambda (vector)))
1555     (local-timezone-abbreviation (lambda ()))
1556     (map-file-to-memory (lambda (address len protection flag fileno :optional offset)))
1557     (memory-mapped-file-pointer (lambda (mmap)))
1558     (memory-mapped-file? (lambda (obj)))
1559     (open-input-file* (lambda (fileno :optional (flags open-mode open/binary open/excl open/fsync open/noctty open/nonblock open/rdonly open/rdwr open/read open/sync open/text))))
1560     (open-input-pipe (lambda (cmdline-string :optional mode)))
1561     (open-output-file* (lambda (fileno :optional (flags open-mode open/append open/binary open/creat open/excl open/fsync open/noctty open/nonblock open/rdwr open/sync open/text open/trunc open/write open/wronly))))
1562     (open-output-pipe (lambda (cmdline-string :optional mode)))
1563;;      (open/append integer)
1564;;      (open/binary integer)
1565;;      (open/creat integer)
1566;;      (open/excl integer)
1567;;      (open/fsync integer)
1568;;      (open/noctty integer)
1569;;      (open/nonblock integer)
1570;;      (open/rdonly integer)
1571;;      (open/rdwr integer)
1572;;      (open/read integer)
1573;;      (open/sync integer)
1574;;      (open/text integer)
1575;;      (open/trunc integer)
1576;;      (open/write integer)
1577;;      (open/wronly integer)
1578     (parent-process-id (lambda ()))
1579;;      (perm/irgrp integer)
1580;;      (perm/iroth integer)
1581;;      (perm/irusr integer)
1582;;      (perm/irwxg integer)
1583;;      (perm/irwxo integer)
1584;;      (perm/irwxu integer)
1585;;      (perm/isgid integer)
1586;;      (perm/isuid integer)
1587;;      (perm/isvtx integer)
1588;;      (perm/iwgrp integer)
1589;;      (perm/iwoth integer)
1590;;      (perm/iwusr integer)
1591;;      (perm/ixgrp integer)
1592;;      (perm/ixoth integer)
1593;;      (perm/ixusr integer)
1594;;      (pipe/buf integer)
1595     (port->fileno (lambda (port)))
1596     (process (lambda (cmdline-string :optional arg-list env-list)))
1597     (process-execute (lambda (filename :optional arg-list env-list)))
1598     (process-fork (lambda (:optional thunk)))
1599     (process-group-id (lambda ()))
1600     (process-run (lambda (filename :optional list)))
1601     (process-signal (lambda (pid :optional signal)))
1602     (process-wait (lambda (:optional pid nohang?)))
1603     (read-symbolic-link (lambda (filename)))
1604     (regular-file? (lambda (filename)))
1605     (seconds->local-time (lambda (seconds)))
1606     (seconds->string (lambda (seconds)))
1607     (seconds->utc-time (lambda (seconds)))
1608     (set-alarm! (lambda (seconds)))
1609     (set-buffering-mode! (lambda (port mode :optional buf-size)))
1610     (set-file-position! (lambda (port-or-fileno pos :optional whence)))
1611     (set-group-id! (lambda (n)))
1612     (set-groups! (lambda (group-n-list)))
1613     (set-process-group-id! (lambda (process-n n)))
1614     (set-root-directory! (lambda (dir)) "chroot")
1615     (set-signal-handler! (lambda (sig-n proc)))
1616     (set-signal-mask! (lambda (sig-n-list)))
1617     (set-user-id! (lambda (n)))
1618     (setenv (lambda (name value-string)))
1619;;      (signal/abrt integer)
1620;;      (signal/alrm integer)
1621;;      (signal/chld integer)
1622;;      (signal/cont integer)
1623;;      (signal/fpe integer)
1624;;      (signal/hup integer)
1625;;      (signal/ill integer)
1626;;      (signal/int integer)
1627;;      (signal/io integer)
1628;;      (signal/kill integer)
1629;;      (signal/pipe integer)
1630;;      (signal/prof integer)
1631;;      (signal/quit integer)
1632;;      (signal/segv integer)
1633;;      (signal/stop integer)
1634;;      (signal/term integer)
1635;;      (signal/trap integer)
1636;;      (signal/tstp integer)
1637;;      (signal/urg integer)
1638;;      (signal/usr1 integer)
1639;;      (signal/usr2 integer)
1640;;      (signal/vtalrm integer)
1641;;      (signal/winch integer)
1642;;      (signal/xcpu integer)
1643;;      (signal/xfsz integer)
1644     (sleep (lambda (seconds)))
1645     (symbolic-link? (lambda (filename)))
1646     (system-information (lambda ()))
1647     (terminal-name (lambda (port)))
1648     (terminal-port? (lambda (port)))
1649     (time->string (lambda (vector)))
1650     (unmap-file-from-memory (lambda (mmap :optional len)))
1651     (unsetenv (lambda (name)))
1652     (user-information (lambda (user-name-or-n)))
1653     (utc-time->seconds (lambda (vector)))
1654     (with-input-from-pipe (lambda (cmdline-string thunk :optional mode)))
1655     (with-output-to-pipe (lambda (cmdline-string thunk :optional mode)))
1656     )
1657    (regex
1658     (glob->regexp (lambda (pattern)))
1659     (glob? (lambda (obj)))
1660     (grep (lambda (pattern list)))
1661     (regexp (lambda (pattern ignore-case? ignore-space? utf-8?)))
1662     (regexp-escape (lambda (string)))
1663     (regexp? (lambda (obj)))
1664     (string-match (lambda (pattern str :optional start)))
1665     (string-match-positions (lambda (pattern str :optional start)))
1666     (string-search (lambda (pattern str :optional start)))
1667     (string-search-positions (lambda (pattern str :optional start)))
1668     (string-split-fields (lambda (pattern str :optional mode start)))
1669     (string-substitute (lambda (pattern subst str :optional mode)))
1670     (string-substitute* (lambda (str subst-list :optional mode)))
1671     )
1672    (tcp
1673     (tcp-abandon-port (lambda (port)))
1674     (tcp-accept (lambda (listener)))
1675     (tcp-accept-ready? (lambda (listener)))
1676     (tcp-addresses (lambda (port)))
1677     (tcp-buffer-size (lambda (:optional new-size)))
1678     (tcp-close (lambda (listener)))
1679     (tcp-connect (lambda (host-string :optioanl tcp-port-n)))
1680     (tcp-listen (lambda (tcp-port-n :optional backlog-n host-string)))
1681     (tcp-listener-fileno (lambda (listener)))
1682     (tcp-listener-port (lambda (listener)))
1683     (tcp-listener? (lambda (obj)))
1684     (tcp-port-numbers (lambda (port)))
1685     )
1686    (utils
1687     (absolute-pathname? (lambda (pathname)))
1688     (create-temporary-file (lambda (:optional ext-str)))
1689     (decompose-pathname (lambda (pathname)))
1690     (delete-file* (lambda (filename)))
1691     (for-each-argv-line (lambda (proc)))
1692     (for-each-line (lambda (proc :optional input-port)))
1693     (make-absolute-pathname (lambda (dir filename :optional ext-str)))
1694     (make-pathname (lambda (dir filename :optional ext-str)))
1695     (pathname-directory (lambda (pathname)))
1696     (pathname-extension (lambda (pathname)))
1697     (pathname-file (lambda (pathname)))
1698     (pathname-replace-directory (lambda (pathname dir)))
1699     (pathname-replace-extension (lambda (pathname ext-str)))
1700     (pathname-replace-file (lambda (pathname filename)))
1701     (pathname-strip-directory (lambda (pathname)))
1702     (pathname-strip-extension (lambda (pathname)))
1703     (port-for-each (lambda (read-fn thunk)))
1704     (port-map (lambda (read-fn thunk)))
1705     (read-all (lambda (:optional file-or-port)))
1706     (shift! (lambda (list :optional default)))
1707     (system* (lambda (format-string arg1 |...|)))
1708     (unshift! (lambda (obj pair)))
1709     )
1710    ))
1711
1712(defvar *scheme-chicken-deps*
1713  '((lolevel extras)
1714    (posix regex extras utils)
1715    (srfi-13 srfi-14)
1716    (tcp extras)
1717    (ajax md5 url srfi-1 spiffy)
1718    (aquaterm srfi-4 srfi-13 lolevel regex)
1719    (args srfi-37)
1720    (array-lib srfi-1 srfi-4 lolevel miscmacros)
1721    ))
1722
1723(defvar *scheme-implementation-exports*
1724  '((chicken
1725     (abort (lambda (obj) undefined))
1726     (add1 (lambda (z) z))
1727     (andmap (lambda (pred list) bool))
1728     (any? (lambda (obj) bool))
1729     (argc+argv (lambda () (values n ptr)))
1730     (argv (lambda () list))
1731     (bit-set? (lambda (n index) bool))
1732     (bitwise-and (lambda (n |...|) n))
1733     (bitwise-ior (lambda (n |...|) n))
1734     (bitwise-not (lambda (n |...|) n))
1735     (bitwise-xor (lambda (n |...|) n))
1736     (blob->string (lambda (blob) string))
1737     (blob-size (lambda (blob) n))
1738     (blob? (lambda (obj) bool))
1739     (breakpoint (lambda (:optional name)))
1740     (build-platform (lambda () symbol))
1741     (c-runtime (lambda () symbol))
1742     (call/cc (lambda (proc)))
1743     (case-sensitive (lambda (:optional on?)))
1744     (chicken-home (lambda () string))
1745     (chicken-version (lambda () string))
1746     (command-line-arguments (lambda () list))
1747     (condition-predicate (lambda (kind) pred))
1748     (condition-property-accessor (lambda (kind prop :optional err?) proc))
1749     (condition? (lambda (obj) bool))
1750     (continuation-capture (lambda (proc)))
1751     (continuation-graft (lambda (continuation thunk)))
1752     (continuation-return (lambda (continuation vals|...|)))
1753     (continuation? (lambda (obj) bool))
1754     (copy-read-table (lambda (read-table) read-table))
1755     (cpu-time (lambda () (values n n)))
1756     (current-error-port (lambda () output-port))
1757     (current-exception-handler (lambda () proc))
1758     (current-gc-milliseconds (lambda () n))
1759     (current-milliseconds (lambda () n))
1760     (current-read-table (lambda () read-table))
1761     (current-seconds (lambda () x))
1762     (define-reader-ctor (lambda (sym proc) undefined))
1763     (delete-file (lambda (filename) undefined))
1764     (disable-interrupts (lambda () undefined))
1765     (dynamic-load-libraries (lambda () list))
1766     (dynamic-wind (lambda (before-thunk thunk after-thunk)))
1767     (enable-interrupts (lambda () undefined))
1768     (enable-warnings (lambda () undefined))
1769     (errno (lambda () n))
1770     (error (lambda (error-string args |...|) undefined))
1771     (eval-handler (lambda () proc))
1772     (exit (lambda (:optional n) undefined))
1773     (exit-handler (lambda () proc))
1774     (extension-info (lambda (proc)))
1775     (extension-information (lambda (proc)))
1776     (feature? (lambda (sym) bool))
1777     (features (lambda () list))
1778     (file-exists? (lambda (filename) bool))
1779     (finite? (lambda (z) bool))
1780     (fixnum? (lambda (obj) bool))
1781     (flonum? (lambda (obj) bool))
1782     (flush-output (lambda (:optional port) undefined))
1783     (force (lambda (promise)))
1784     (force-finalizers (lambda (f args |...|)))
1785     (fp* (lambda (x1 x2) x))
1786     (fp+ (lambda (x1 x2) x))
1787     (fp- (lambda (x1 x2) x))
1788     (fp/ (lambda (x1 x2) x))
1789     (fp< (lambda (x1 x2) x))
1790     (fp<= (lambda (x1 x2) x))
1791     (fp= (lambda (x1 x2) x))
1792     (fp> (lambda (x1 x2) x))
1793     (fp>= (lambda (x1 x2) x))
1794     (fpmax (lambda (x1 x2) x))
1795     (fpmin (lambda (x1 x2) x))
1796     (fpneg (lambda (x1 x2) x))
1797     (fx* (lambda (n1 n2) n))
1798     (fx+ (lambda (n1 n2) n))
1799     (fx- (lambda (n1 n2) n))
1800     (fx/ (lambda (n1 n2) n))
1801     (fx< (lambda (n1 n2) n))
1802     (fx<= (lambda (n1 n2) n))
1803     (fx= (lambda (n1 n2) n))
1804     (fx> (lambda (n1 n2) n))
1805     (fx>= (lambda (n1 n2) n))
1806     (fxand (lambda (n1 n2) n))
1807     (fxior (lambda (n1 n2) n))
1808     (fxmax (lambda (n1 n2) n))
1809     (fxmin (lambda (n1 n2) n))
1810     (fxmod (lambda (n1 n2) n))
1811     (fxneg (lambda (n1 n2) n))
1812     (fxnot (lambda (n1 n2) n))
1813     (fxshl (lambda (n1 n2) n))
1814     (fxshr (lambda (n1 n2) n))
1815     (fxxor (lambda (n1 n2) n))
1816     (gc (lambda () n))
1817     (gensym (lambda (:optional name) sym))
1818     (get-call-chain (lambda (:optional n) list))
1819     (get-keyword (lambda (sym list :optional default)))
1820     (get-line-number (lambda (sexp) n))
1821     (get-output-string (lambda (string-output-port) string))
1822     (getenv (lambda (name) string))
1823     (getter-with-setter (lambda (get-proc set-proc) proc))
1824     (implicit-exit-handler (lambda (:optional proc) proc))
1825     (invalid-procedure-call-handler (lambda (:optional proc) proc))
1826     (keyword->string (lambda (sym) string))
1827     (keyword-style (lambda (:optional sym) sym))
1828     (keyword? (lambda (obj) bool))
1829     (load-library (lambda (sym) undefined))
1830     (load-noisily (lambda (string) undefined))
1831     (load-relative (lambda (string) undefined))
1832     (load-verbose (lambda (:optional bool) bool))
1833     (machine-byte-order (lambda () sym))
1834     (machine-type (lambda () sym))
1835     (macro? (lambda (obj) bool))
1836     (macroexpand (lambda (sexp) sexp))
1837     (macroexpand-1 (lambda (sexp) sexp))
1838     (make-blob (lambda (size) blob))
1839     (make-composite-condition (lambda (condition |...|) condition))
1840     (make-parameter (lambda (val) proc))
1841     (make-property-condition (lambda (kind |...|) condition))
1842     (match-error-control (lambda (:optional proc) proc))
1843     (match-error-procedure (lambda (:optional proc) proc))
1844     (memory-statistics (lambda () vector))
1845     (on-exit (lambda (thunk) undefined))
1846     (open-input-string (lambda (string) string-input-port))
1847     (open-output-string (lambda () string-output-port))
1848     (ormap (lambda (pred list |...|) bool))
1849     (port-name (lambda (port) name))
1850     (port-position (lambda (port) n))
1851     (port? (lambda (obj) bool))
1852     (print (lambda (obj |...|)))
1853     (print* (lambda (obj |...|)))
1854     (print-backtrace (lambda (:optional n) undefined))
1855     (print-call-chain (lambda (:optional n) undefined))
1856     (print-error-message (lambda (err args |...|) undefined))
1857     (procedure-information (lambda (proc)))
1858     (program-name (lambda (:optional name) name))
1859     (provide (lambda (name)))
1860     (provided? (lambda (name) bool))
1861     (rational? (lambda (obj) bool))
1862     (read-byte (lambda (:optional input-port) n))
1863     (register-feature! (lambda (name) undefined))
1864     (rename-file (lambda (old-name new-name) undefined))
1865     (repl (lambda () undefined))
1866     (repository-path (lambda (:optional dirname) dirname))
1867     (require (lambda (sym |...|) undefined))
1868     (reset (lambda () undefined))
1869     (reset-handler (lambda (:optional proc) proc))
1870     (return-to-host (lambda () undefined))
1871     (reverse-list->string (lambda (list) string))
1872     (set-dynamic-load-mode! (lambda (obj) undefined))
1873     (set-extension-specifier! (lambda (name proc) undefined))
1874     (set-finalizer! (lambda (obj proc) undefined))
1875     (set-gc-report! (lambda (bool) undefined))
1876     (set-parameterized-read-syntax! (lambda (ch proc) undefined))
1877     (set-port-name! (lambda (port name) undefined))
1878     (set-read-syntax! (lambda (ch proc) undefined))
1879     (set-sharp-read-syntax! (lambda (ch proc) undefined))
1880     (setter (lambda (proc) proc))
1881     (signal (lambda (n) undefined))
1882     (signum (lambda (x) x))
1883     (singlestep (lambda (thunk)))
1884     (software-type (lambda () sym))
1885     (software-version (lambda () sym))
1886     (string->blob (lambda (string) blob))
1887     (string->keyword (lambda (string) sym))
1888     (string->uninterned-symbol (lambda (string) sym))
1889     (string-copy (lambda (string) string))
1890     (sub1 (lambda (x) x))
1891     (syntax-error (lambda (args |...|) undefined))
1892     (system (lambda (str) n))
1893     (test-feature? (lambda (obj) bool))
1894     (undefine-macro! (lambda (sym) undefined))
1895     (unregister-feature! (lambda (sym) undefined))
1896     (use (special chicken-available-modules)
1897          "import extensions into top-level namespace")
1898     (vector-copy! (lambda (from-vector to-vector :optional start) undefined))
1899     (vector-resize (lambda (vec n :optional init)))
1900     (void (lambda () undefined))
1901     (warning (lambda (msg-str args |...|) undefined))
1902     (with-exception-handler (lambda (handler thunk)))
1903     (write-byte (lambda (n :optional output-port) undefined))
1904     )
1905    (gauche
1906     (E2BIG integer)
1907     (EACCES integer)
1908     (EADDRINUSE integer)
1909     (EADDRNOTAVAIL integer)
1910     (EADV integer)
1911     (EAFNOSUPPORT integer)
1912     (EAGAIN integer)
1913     (EALREADY integer)
1914     (EBADE integer)
1915     (EBADF integer)
1916     (EBADFD integer)
1917     (EBADMSG integer)
1918     (EBADR integer)
1919     (EBADRQC integer)
1920     (EBADSLT integer)
1921     (EBFONT integer)
1922     (EBUSY integer)
1923     (ECANCELED integer)
1924     (ECHILD integer)
1925     (ECHRNG integer)
1926     (ECOMM integer)
1927     (ECONNABORTED integer)
1928     (ECONNREFUSED integer)
1929     (ECONNRESET integer)
1930     (EDEADLK integer)
1931     (EDEADLOCK integer)
1932     (EDESTADDRREQ integer)
1933     (EDOM integer)
1934     (EDOTDOT integer)
1935     (EDQUOT integer)
1936     (EEXIST integer)
1937     (EFAULT integer)
1938     (EFBIG integer)
1939     (EHOSTDOWN integer)
1940     (EHOSTUNREACH integer)
1941     (EIDRM integer)
1942     (EILSEQ integer)
1943     (EINPROGRESS integer)
1944     (EINTR integer)
1945     (EINVAL integer)
1946     (EIO integer)
1947     (EISCONN integer)
1948     (EISDIR integer)
1949     (EISNAM integer)
1950     (EKEYEXPIRED integer)
1951     (EKEYREJECTED integer)
1952     (EKEYREVOKED integer)
1953     (EL2HLT integer)
1954     (EL2NSYNC integer)
1955     (EL3HLT integer)
1956     (EL3RST integer)
1957     (ELIBACC integer)
1958     (ELIBBAD integer)
1959     (ELIBEXEC integer)
1960     (ELIBMAX integer)
1961     (ELIBSCN integer)
1962     (ELNRNG integer)
1963     (ELOOP integer)
1964     (EMEDIUMTYPE integer)
1965     (EMFILE integer)
1966     (EMLINK integer)
1967     (EMSGSIZE integer)
1968     (EMULTIHOP integer)
1969     (ENAMETOOLONG integer)
1970     (ENAVAIL integer)
1971     (ENETDOWN integer)
1972     (ENETRESET integer)
1973     (ENETUNREACH integer)
1974     (ENFILE integer)
1975     (ENOANO integer)
1976     (ENOBUFS integer)
1977     (ENOCSI integer)
1978     (ENODATA integer)
1979     (ENODEV integer)
1980     (ENOENT integer)
1981     (ENOEXEC integer)
1982     (ENOKEY integer)
1983     (ENOLCK integer)
1984     (ENOLINK integer)
1985     (ENOMEDIUM integer)
1986     (ENOMEM integer)
1987     (ENOMSG integer)
1988     (ENONET integer)
1989     (ENOPKG integer)
1990     (ENOPROTOOPT integer)
1991     (ENOSPC integer)
1992     (ENOSR integer)
1993     (ENOSTR integer)
1994     (ENOSYS integer)
1995     (ENOTBLK integer)
1996     (ENOTCONN integer)
1997     (ENOTDIR integer)
1998     (ENOTEMPTY integer)
1999     (ENOTNAM integer)
2000     (ENOTSOCK integer)
2001     (ENOTTY integer)
2002     (ENOTUNIQ integer)
2003     (ENXIO integer)
2004     (EOPNOTSUPP integer)
2005     (EOVERFLOW integer)
2006     (EPERM integer)
2007     (EPFNOSUPPORT integer)
2008     (EPIPE integer)
2009     (EPROTO integer)
2010     (EPROTONOSUPPORT integer)
2011     (EPROTOTYPE integer)
2012     (ERANGE integer)
2013     (EREMCHG integer)
2014     (EREMOTE integer)
2015     (EREMOTEIO integer)
2016     (ERESTART integer)
2017     (EROFS integer)
2018     (ESHUTDOWN integer)
2019     (ESOCKTNOSUPPORT integer)
2020     (ESPIPE integer)
2021     (ESRCH integer)
2022     (ESRMNT integer)
2023     (ESTALE integer)
2024     (ESTRPIPE integer)
2025     (ETIME integer)
2026     (ETIMEDOUT integer)
2027     (ETOOMANYREFS integer)
2028     (ETXTBSY integer)
2029     (EUCLEAN integer)
2030     (EUNATCH integer)
2031     (EUSERS integer)
2032     (EWOULDBLOCK integer)
2033     (EXDEV integer)
2034     (EXFULL integer)
2035     (F_OK integer)
2036     (LC_ALL integer)
2037     (LC_COLLATE integer)
2038     (LC_CTYPE integer)
2039     (LC_MONETARY integer)
2040     (LC_NUMERIC integer)
2041     (LC_TIME integer)
2042     (RAND_MAX integer)
2043     (R_OK integer)
2044     (SEEK_CUR integer)
2045     (SEEK_END integer)
2046     (SEEK_SET integer)
2047     (SIGABRT integer)
2048     (SIGALRM integer)
2049     (SIGBUS integer)
2050     (SIGCHLD integer)
2051     (SIGCONT integer)
2052     (SIGFPE integer)
2053     (SIGHUP integer)
2054     (SIGILL integer)
2055     (SIGINT integer)
2056     (SIGIO integer)
2057     (SIGIOT integer)
2058     (SIGKILL integer)
2059     (SIGPIPE integer)
2060     (SIGPOLL integer)
2061     (SIGPROF integer)
2062     (SIGPWR integer)
2063     (SIGQUIT integer)
2064     (SIGSEGV integer)
2065     (SIGSTKFLT integer)
2066     (SIGSTOP integer)
2067     (SIGTERM integer)
2068     (SIGTRAP integer)
2069     (SIGTSTP integer)
2070     (SIGTTIN integer)
2071     (SIGTTOU integer)
2072     (SIGURG integer)
2073     (SIGUSR1 integer)
2074     (SIGUSR2 integer)
2075     (SIGVTALRM integer)
2076     (SIGWINCH integer)
2077     (SIGXCPU integer)
2078     (SIGXFSZ integer)
2079     (SIG_BLOCK integer)
2080     (SIG_SETMASK integer)
2081     (SIG_UNBLOCK integer)
2082     (W_OK integer)
2083     (X_OK integer)
2084     (acons (lambda (key value alist) alist))
2085     (acosh (lambda (z) z))
2086     (add-load-path (lambda (path) undefined))
2087     (add-method! (lambda (generic method) undefined))
2088     (all-modules (lambda () list))
2089     (allocate-instance (lambda (class list)))
2090     (and-let* (syntax))
2091     (any (lambda (pred list)))
2092     (any$ (lambda (pred) proc))
2093     (any-pred (lambda (pred |...|) pred))
2094     (append! (lambda (list |...|) list))
2095     (apply$ (lambda (proc) proc))
2096     (apply-generic (lambda (generic list)))
2097     (apply-method (lambda (method list)))
2098     (apply-methods (lambda (generic list list)))
2099     (arity (lambda (proc) n))
2100     (arity-at-least-value (lambda (n)))
2101     (arity-at-least? (lambda (proc) bool))
2102     (ash (lambda (n i) n))
2103     (asinh (lambda (z) z))
2104     (assoc$ (lambda (obj) proc))
2105     (atanh (lambda (z) z))
2106     (autoload (syntax))
2107     (begin0 (syntax))
2108     (bignum? (lambda (obj) bool))
2109     (bit-field (lambda (n start end) n))
2110     (byte-ready? (lambda (:optional input-port) bool))
2111     (call-with-input-string (lambda (str proc)))
2112     (call-with-output-string (lambda (proc) str))
2113     (call-with-string-io (lambda (str proc) str))
2114     (case-lambda (syntax))
2115     (change-class (lambda (obj new-class)))
2116     (change-object-class (lambda (obj orig-class new-class)))
2117     (char->ucs (lambda (ch) int))
2118     (char-set (lambda (ch |...|) char-set))
2119     (char-set-contains? (lambda (char-set ch) bool))
2120     (char-set-copy (lambda (char-set) char-set))
2121     (char-set? (lambda (obj) bool))
2122     (check-arg (syntax))
2123     (circular-list? (lambda (obj) bool))
2124     (clamp (lambda (x :optional min-x max-x) x))
2125     (class-direct-methods (lambda (class) list))
2126     (class-direct-slots (lambda (class) list))
2127     (class-direct-subclasses (lambda (class) list))
2128     (class-direct-supers (lambda (class) list))
2129     (class-name (lambda (class) sym))
2130     (class-of (lambda (obj) class))
2131     (class-precedence-list (lambda (class) list))
2132     (class-slot-accessor (lambda (class id) proc))
2133     (class-slot-bound? (lambda (class id) bool))
2134     (class-slot-definition (lambda (class id)))
2135     (class-slot-ref (lambda (class slot)))
2136     (class-slot-set! (lambda (class slot val) undefined))
2137     (class-slots (lambda (class) list))
2138     (closure-code (lambda (proc)))
2139     (closure? (lambda (obj) bool))
2140     (compare (lambda (obj1 obj2) n))
2141     (complement (lambda (proc) proc))
2142     (compose (lambda (proc |...|) proc))
2143     (compute-applicable-methods (lambda (generic list)))
2144     (compute-cpl (lambda (generic list)))
2145     (compute-get-n-set (lambda (class slot)))
2146     (compute-slot-accessor (lambda (class slot)))
2147     (compute-slots (lambda (class)))
2148     (cond-expand (syntax))
2149     (condition (syntax))
2150     (condition-has-type? (lambda (condition obj)))
2151     (condition-ref (lambda (condition id)))
2152     (condition-type? (lambda (obj) bool))
2153     (condition? (lambda (obj) bool))
2154     (copy-bit (lambda (index n i) n))
2155     (copy-bit-field (lambda (n start end from) n))
2156     (copy-port (lambda (from-port to-port :optional unit-sym) undefined))
2157     (cosh (lambda (z) z))
2158     (count$ (lambda (pred) proc))
2159     (current-class-of (lambda (obj) class))
2160     (current-error-port (lambda () output-port))
2161     (current-exception-handler (lambda () handler))
2162     (current-load-history (lambda () list))
2163     (current-load-next (lambda () list))
2164     (current-load-port (lambda () port))
2165     (current-module (lambda () env))
2166     (current-thread (lambda () thread))
2167     (current-time (lambda () time))
2168     (cut (syntax))
2169     (cute (lambda (args |...|) proc))
2170     (debug-print (lambda (obj)))
2171     (debug-print-width (lambda () int))
2172     (debug-source-info (lambda (obj)))
2173     (dec! (syntax))
2174     (decode-float (lambda (x) vector))
2175     (define-class (syntax))
2176     (define-condition-type (syntax))
2177     (define-constant (syntax))
2178     (define-generic (syntax))
2179     (define-in-module (syntax))
2180     (define-inline (syntax))
2181     (define-macro (syntax))
2182     (define-method (syntax))
2183     (define-module (syntax))
2184     (define-reader-ctor (lambda (sym proc) undefined))
2185     (define-values (syntax))
2186     (delete$ (lambda (obj) proc))
2187     (delete-keyword (lambda (id list) list))
2188     (delete-keyword! (lambda (id list) list))
2189     (delete-method! (lambda (generic method) undefined))
2190     (digit->integer (lambda (ch) n))
2191     (disasm (lambda (proc) undefined))
2192     (dolist (syntax))
2193     (dotimes (syntax))
2194     (dotted-list? (lambda (obj) bool))
2195     (dynamic-load (lambda (file)))
2196     (eager (lambda (obj)))
2197     (eq-hash (lambda (obj)))
2198     (eqv-hash (lambda (obj)))
2199     (error (lambda (msg-string args |...|)))
2200     (errorf (lambda (fmt-string args |...|)))
2201     (eval-when (syntax))
2202     (every$ (lambda (pred) pred))
2203     (every-pred (lambda (pred |...|) pred))
2204     (exit (lambda (:optional n) undefined))
2205     (export (syntax))
2206     (export-all (syntax))
2207     (export-if-defined (syntax))
2208     (extend (syntax))
2209     (extract-condition (lambda (condition type)))
2210     (file-exists? (lambda (filename) bool))
2211     (file-is-directory? (lambda (filename) bool))
2212     (file-is-regular? (lambda (filename) bool))
2213     (filter$ (lambda (pred) proc))
2214     (find (lambda (pred list)))
2215     (find$ (lambda (pred) proc))
2216     (find-module (lambda (id) env))
2217     (find-tail$ (lambda (pred) proc))
2218     (fixnum? (lambda (obj) bool))
2219     (flonum? (lambda (obj) bool))
2220     (fluid-let (syntax))
2221     (flush (lambda (:optional output-port) undefined))
2222     (flush-all-ports (lambda () undefined))
2223     (fmod (lambda (x1 x2) x))
2224     (fold (lambda (proc init list)))
2225     (fold$ (lambda (proc :optional init) proc))
2226     (fold-right (lambda (proc init list)))
2227     (fold-right$ (lambda (proc :optional init)))
2228     (for-each$ (lambda (proc) proc))
2229     (foreign-pointer-attribute-get (lambda (ptr attr)))
2230     (foreign-pointer-attribute-set (lambda (ptr attr val)))
2231     (foreign-pointer-attributes (lambda (ptr) list))
2232     (format (lambda (fmt-string arg |...|)))
2233     (format/ss (lambda (fmt-string arg |...|)))
2234     (frexp (lambda (x) x))
2235     (gauche-architecture (lambda () string))
2236     (gauche-architecture-directory (lambda () string))
2237     (gauche-character-encoding (lambda () symbol))
2238     (gauche-dso-suffix (lambda () string))
2239     (gauche-library-directory (lambda () string))
2240     (gauche-site-architecture-directory (lambda () string))
2241     (gauche-site-library-directory (lambda () string))
2242     (gauche-version (lambda () string))
2243     (gc (lambda () undefined))
2244     (gc-stat (lambda () list))
2245     (gensym (lambda (:optional name) symbol))
2246     (get-keyword (lambda (id list :optional default)))
2247     (get-keyword* (syntax))
2248     (get-optional (syntax))
2249     (get-output-string (lambda (string-output-port) string))
2250     (get-remaining-input-string (lambda (port) string))
2251     (get-signal-handler (lambda (n) proc))
2252     (get-signal-handler-mask (lambda (n) n))
2253     (get-signal-handlers (lambda () list))
2254     (get-signal-pending-limit (lambda () n))
2255     (getter-with-setter (lambda (get-proc set-proc) proc))
2256     (global-variable-bound? (lambda (sym) bool))
2257     (global-variable-ref (lambda (sym)))
2258     (guard (syntax))
2259     (has-setter? (lambda (proc) bool))
2260     (hash (lambda (obj)))
2261     (hash-table (lambda (id pair |...|) hash-table))
2262     (hash-table-delete! (lambda (hash-table key) undefined))
2263     (hash-table-exists? (lambda (hash-table key) bool))
2264     (hash-table-fold (lambda (hash-table proc init)))
2265     (hash-table-for-each (lambda (hash-table proc) undefined))
2266     (hash-table-get (lambda (hash-table key :optional default)))
2267     (hash-table-keys (lambda (hash-table) list))
2268     (hash-table-map (lambda (hash-table proc) list))
2269     (hash-table-num-entries (lambda (hash-table) n))
2270     (hash-table-pop! (lambda (hash-table key :optional default)))
2271     (hash-table-push! (lambda (hash-table key value) undefined))
2272     (hash-table-put! (lambda (hash-table key value) undefined))
2273     (hash-table-stat (lambda (hash-table) list))
2274     (hash-table-type (lambda (hash-table) id))
2275     (hash-table-update! (lambda (hash-table key proc :optional default) undefined))
2276     (hash-table-values (lambda (hash-table) list))
2277     (hash-table? (lambda (obj) bool))
2278     (identifier->symbol (lambda (obj) sym))
2279     (identifier? (lambda (obj) bool))
2280     (identity (lambda (obj)))
2281     (import (syntax))
2282     (inc! (syntax))
2283     (inexact-/ (lambda (x1 x2) x))
2284     (initialize (lambda (obj)))
2285     (instance-slot-ref (lambda (obj id)))
2286     (instance-slot-set (lambda (obj id value)))
2287     (integer->digit (lambda (n) ch))
2288     (integer-length (lambda (n) n))
2289     (is-a? (lambda (obj class) bool))
2290     (keyword->string (lambda (id) string))
2291     (keyword? (lambda (obj) bool))
2292     (last-pair (lambda (pair) pair))
2293     (lazy (syntax))
2294     (ldexp (lambda (x n) x))
2295     (let-keywords* (syntax))
2296     (let-optionals* (syntax))
2297     (let/cc (syntax))
2298     (let1 (syntax))
2299     (library-exists? (lambda (filename) bool))
2300     (library-fold (lambda (string proc init)))
2301     (library-for-each (lambda (string proc) undefined))
2302     (library-has-module? (lambda (filename id) bool))
2303     (library-map (lambda (string proc) list))
2304     (list* (lambda (obj |...|) list))
2305     (list-copy (lambda (list) list))
2306     (logand (lambda (n |...|) n))
2307     (logbit? (lambda (index n) bool))
2308     (logcount (lambda (n) n))
2309     (logior (lambda (n |...|) n))
2310     (lognot (lambda (n) n))
2311     (logtest (lambda (n |...|) bool))
2312     (logxor (lambda (n |...|) n))
2313     (macroexpand (lambda (obj)))
2314     (macroexpand-1 (lambda (obj)))
2315     (make (lambda (class args |...|)))
2316     (make-byte-string (lambda (n :optional int) byte-string))
2317     (make-compound-condition (lambda (condition |...|) condition))
2318     (make-condition (lambda (condition-type field+value |...|) condition))
2319     (make-condition-type (lambda (id condition-type list) condition-type))
2320     (make-hash-table (lambda (:optional id) hash-table))
2321     (make-keyword (lambda (string) sym))
2322     (make-list (lambda (n :optional init) list))
2323     (make-module (lambda (id :optional if-exists-proc) env))
2324     (make-weak-vector (lambda (n) vector))
2325     (map$ (lambda (proc) proc))
2326     (member$ (lambda (obj) proc))
2327     (merge (lambda (list1 list2 proc) list))
2328     (merge! (lambda (list1 list2 proc) list))
2329     (method-more-specific? (lambda (method1 method2 list) bool))
2330     (min&max (lambda (x |...|) (values x1 x2)))
2331     (modf (lambda (x) x))
2332     (module-exports (lambda (env) list))
2333     (module-imports (lambda (env) list))
2334     (module-name (lambda (env) sym))
2335     (module-name->path (lambda (sym) string))
2336     (module-parents (lambda (env) list))
2337     (module-precedence-list (lambda (env) list))
2338     (module-table (lambda (env) hash-table))
2339     (module? (lambda (obj) bool))
2340     (null-list? (lambda (obj) bool))
2341     (object-* (lambda (z |...|) z))
2342     (object-+ (lambda (z |...|) z))
2343     (object-- (lambda (z |...|) z))
2344     (object-/ (lambda (z |...|) z))
2345     (object-apply (lambda (proc arg |...|)))
2346     (object-compare (lambda (obj1 obj2) n))
2347     (object-equal? (lambda (obj1 obj2) bool))
2348     (object-hash (lambda (obj) n))
2349     (open-coding-aware-port (lambda (input-port) input-port))
2350     (open-input-buffered-port (lambda ()))
2351     (open-input-fd-port (lambda (fileno) input-port))
2352     (open-input-string (lambda (str) input-port))
2353     (open-output-buffered-port (lambda ()))
2354     (open-output-fd-port (lambda (fileno) output-port))
2355     (open-output-string (lambda () string-output-port))
2356     (pa$ (lambda (proc arg |...|) proc))
2357     (partition$ (lambda (pred) proc))
2358     (path->module-name (lambda (str) sym))
2359     (peek-byte (lambda (:optional input-port) n))
2360     (pop! (syntax (list)))
2361     (port->byte-string (lambda (input-port) byte-string))
2362     (port->list (lambda (proc input-port) list))
2363     (port->sexp-list (lambda (port) list))
2364     (port->string (lambda (port) string))
2365     (port->string-list (lambda (port) list))
2366     (port-buffering (lambda (port) sym))
2367     (port-closed? (lambda (port) bool))
2368     (port-current-line (lambda (port) n))
2369     (port-file-number (lambda (port) n))
2370     (port-fold (lambda (proc init port)))
2371     (port-fold-right (lambda (proc init port)))
2372     (port-for-each (lambda (proc read-proc)))
2373     (port-map (lambda (proc read-proc)))
2374     (port-name (lambda (port) name))
2375     (port-position-prefix (lambda ()))
2376     (port-seek (lambda (port offset (set int SEEK_SET SEEK_CUR SEEK_END))))
2377     (port-tell (lambda (port) n))
2378     (port-type (lambda (port) sym))
2379     (print (lambda (obj |...|)))
2380     (procedure-arity-includes? (lambda (proc n) bool))
2381     (procedure-info (lambda (proc)))
2382     (profiler-reset (lambda () undefined))
2383     (profiler-show (lambda () undefined))
2384     (profiler-show-load-stats (lambda () undefined))
2385     (profiler-start (lambda () undefined))
2386     (profiler-stop (lambda () undefined))
2387     (program (syntax))
2388     (promise-kind (lambda ()))
2389     (promise? (lambda (obj) bool))
2390     (proper-list? (lambda (obj) bool))
2391     (provide (lambda (str) undefined))
2392     (provided? (lambda (str) bool))
2393     (push! (syntax))
2394     (quotient&remainder (lambda (n1 n2) (values n1 n2)))
2395     (raise (lambda (exn) undefined))
2396     (read-block (lambda (n :optional input-port) string))
2397     (read-byte (lambda (:optional input-port) n))
2398     (read-eval-print-loop (lambda () undefined))
2399     (read-from-string (lambda (str)))
2400     (read-line (lambda (:optional input-port) str))
2401     (read-list (lambda (ch :optional input-port)))
2402     (read-reference-has-value? (lambda ()))
2403     (read-reference-value (lambda ()))
2404     (read-reference? (lambda ()))
2405     (read-with-shared-structure (lambda (:optional input-port)))
2406     (read/ss (lambda (:optional input-port)))
2407     (rec (syntax))
2408     (receive (syntax))
2409     (redefine-class! (lambda ()))
2410     (reduce$ (lambda (proc :optional default) proc))
2411     (reduce-right$ (lambda (proc :optional default) proc))
2412     (ref (lambda (obj key |...|)))
2413     (ref* (lambda (obj key |...|)))
2414     (regexp->string (lambda (regexp) string))
2415     (regexp-case-fold? (lambda (regexp) bool))
2416     (regexp-compile (lambda (str) regexp))
2417     (regexp-optimize (lambda (str) str))
2418     (regexp-parse (lambda (str) list))
2419     (regexp-quote (lambda (str) str))
2420     (regexp-replace (lambda (regexp string subst) string))
2421     (regexp-replace* (lambda (string regexp subst |...|) string))
2422     (regexp-replace-all (lambda (regexp string subst) string))
2423     (regexp-replace-all* (lambda (string regexp subst |...|)))
2424     (regexp? (lambda (obj) bool))
2425     (regmatch? (lambda (obj) bool))
2426     (remove$ (lambda (pred) proc))
2427     (report-error (lambda ()))
2428     (require (syntax))
2429     (require-extension (syntax))
2430     (reverse! (lambda (list) list))
2431     (rxmatch (lambda (regexp string) regmatch))
2432     (rxmatch-after (lambda (regmatch :optional i) str))
2433     (rxmatch-before (lambda (regmatch :optional i) str))
2434     (rxmatch-case (syntax))
2435     (rxmatch-cond (syntax))
2436     (rxmatch-end (lambda (regmatch :optional i) n))
2437     (rxmatch-if (syntax))
2438     (rxmatch-let (syntax))
2439     (rxmatch-num-matches (lambda (regmatch) i))
2440     (rxmatch-start (lambda (regmatch :optional i) n))
2441     (rxmatch-substring (lambda (regmatch :optional i) str))
2442     (seconds->time (lambda (x) time))
2443     (select-module (syntax))
2444     (set!-values (syntax))
2445     (set-signal-handler! (lambda (signals handler) undefined))
2446     (set-signal-pending-limit (lambda (n) undefined))
2447     (setter (lambda (proc) proc))
2448     (sinh (lambda (z) z))
2449     (slot-bound-using-accessor? (lambda (proc obj id) bool))
2450     (slot-bound-using-class? (lambda (class obj id) bool))
2451     (slot-bound? (lambda (obj id) bool))
2452     (slot-definition-accessor (lambda ()))
2453     (slot-definition-allocation (lambda ()))
2454     (slot-definition-getter (lambda ()))
2455     (slot-definition-name (lambda ()))
2456     (slot-definition-option (lambda ()))
2457     (slot-definition-options (lambda ()))
2458     (slot-definition-setter (lambda ()))
2459     (slot-exists-using-class? (lambda (class obj id) bool))
2460     (slot-exists? (lambda (obj id) bool))
2461     (slot-initialize-using-accessor! (lambda ()))
2462     (slot-missing (lambda (class obj id)))
2463     (slot-push! (lambda (obj id value) undefined))
2464     (slot-ref (lambda (obj id)))
2465     (slot-ref-using-accessor (lambda (proc obj id)))
2466     (slot-ref-using-class (lambda (class obj id)))
2467     (slot-set! (lambda (obj id value) undefined))
2468     (slot-set-using-accessor! (lambda (proc obj id value) undefined))
2469     (slot-set-using-class! (lambda (class obj id value) undefined))
2470     (slot-unbound (lambda (class obj id)))
2471     (sort (lambda (seq :optional proc)))
2472     (sort! (lambda (seq :optional proc)))
2473     (sort-applicable-methods (lambda ()))
2474     (sorted? (lambda (seq :optional proc)))
2475     (split-at (lambda (list i) (values list list)))
2476     (stable-sort (lambda (seq :optional proc)))
2477     (stable-sort! (lambda (seq :optional proc)))
2478     (standard-error-port (lambda () output-port))
2479     (standard-input-port (lambda () input-port))
2480     (standard-output-port (lambda () output-port))
2481     (string->regexp (lambda (str) regexp))
2482     (string-byte-ref (lambda (str i) n))
2483     (string-byte-set! (lambda (str i n) undefined))
2484     (string-complete->incomplete (lambda (str) str))
2485     (string-immutable? (lambda (str) bool))
2486     (string-incomplete->complete (lambda (str) str))
2487     (string-incomplete->complete! (lambda (str) str))
2488     (string-incomplete? (lambda (str) bool))
2489     (string-interpolate (lambda (str) list))
2490     (string-join (lambda (list :optional delim-str (set grammar infix strict-infix prefix suffix))))
2491;; deprecated
2492;;      (string-pointer-byte-index (lambda ()))
2493;;      (string-pointer-copy (lambda ()))
2494;;      (string-pointer-index (lambda ()))
2495;;      (string-pointer-next! (lambda ()))
2496;;      (string-pointer-prev! (lambda ()))
2497;;      (string-pointer-ref (lambda ()))
2498;;      (string-pointer-set! (lambda ()))
2499;;      (string-pointer-substring (lambda ()))
2500;;      (string-pointer? (lambda ()))
2501     (string-scan (lambda (string item :optional (set return index before after before* after* both))))
2502     (string-size (lambda (str) n))
2503     (string-split (lambda (str splitter) list))
2504     (string-substitute! (lambda ()))
2505     (subr? (lambda (obj) bool))
2506     (supported-character-encoding? (lambda (id) bool))
2507     (supported-character-encodings (lambda () list))
2508     (symbol-bound? (lambda (id) bool))
2509     (syntax-error (syntax))
2510     (syntax-errorf (syntax))
2511     (sys-abort (lambda () undefined))
2512     (sys-access (lambda (filename (flags amode R_OK W_OK X_OK F_OK))))
2513     (sys-alarm (lambda (x) x))
2514     (sys-asctime (lambda (time) str))
2515     (sys-basename (lambda (filename) str))
2516     (sys-chdir (lambda (dirname)))
2517     (sys-chmod (lambda (filename n)))
2518     (sys-chown (lambda (filename uid gid)))
2519     (sys-close (lambda (fileno)))
2520     (sys-crypt (lambda (key-str salt-str) str))
2521     (sys-ctermid (lambda () string))
2522     (sys-ctime (lambda (time) string))
2523     (sys-difftime (lambda (time1 time2) x))
2524     (sys-dirname (lambda (filename) string))
2525     (sys-exec (lambda (command-string list) n))
2526     (sys-exit (lambda (n) undefined))
2527     (sys-fchmod (lambda (port-or-fileno n)))
2528     (sys-fdset-max-fd (lambda (fdset)))
2529     (sys-fdset-ref (lambda (fdset port-or-fileno)))
2530     (sys-fdset-set! (lambda (fdset port-or-fileno)))
2531     (sys-fork (lambda () n))
2532     (sys-fork-and-exec (lambda (command-string list) n))
2533     (sys-fstat (lambda (port-or-fileno) sys-stat))
2534     (sys-ftruncate (lambda (port-or-fileno n)))
2535     (sys-getcwd (lambda () string))
2536     (sys-getdomainname (lambda () string))
2537     (sys-getegid (lambda () gid))
2538     (sys-getenv (lambda (name) string))
2539     (sys-geteuid (lambda () uid))
2540     (sys-getgid (lambda () gid))
2541     (sys-getgrgid (lambda () gid))
2542     (sys-getgrnam (lambda (name)))
2543     (sys-getgroups (lambda () list))
2544     (sys-gethostname (lambda () string))
2545     (sys-getloadavg (lambda () list))
2546     (sys-getlogin (lambda () string))
2547     (sys-getpgid (lambda () gid))
2548     (sys-getpgrp (lambda () gid))
2549     (sys-getpid (lambda () pid))
2550     (sys-getppid (lambda () pid))
2551     (sys-getpwnam (lambda (name)))
2552     (sys-getpwuid (lambda () uid))
2553     (sys-gettimeofday (lambda () (values x1 x2)))
2554     (sys-getuid (lambda () uid))
2555     (sys-gid->group-name (lambda (gid) name))
2556     (sys-glob (lambda (string) list))
2557     (sys-gmtime (lambda (time) string))
2558     (sys-group-name->gid (lambda (name) gid))
2559     (sys-isatty (lambda (port-or-fileno) bool))
2560     (sys-kill (lambda (pid)))
2561     (sys-lchown (lambda (filename uid gid)))
2562     (sys-link (lambda (old-filename new-filename)))
2563     (sys-localeconv (lambda () alist))
2564     (sys-localtime (lambda (time) string))
2565     (sys-lstat (lambda (filename) sys-stat))
2566     (sys-mkdir (lambda (dirname)))
2567     (sys-mkfifo (lambda (filename)))
2568     (sys-mkstemp (lambda (filename)))
2569     (sys-mktime (lambda (time) x))
2570     (sys-nanosleep (lambda (x)))
2571     (sys-normalize-pathname (lambda (filename) string))
2572     (sys-pause (lambda (x)))
2573     (sys-pipe (lambda (:optional buffering) (values input-port output-port)))
2574     (sys-putenv (lambda (name string)))
2575     (sys-random (lambda () n))
2576     (sys-readdir (lambda (dirname) list))
2577     (sys-readlink (lambda (filename) string))
2578     (sys-realpath (lambda (filename) string))
2579     (sys-remove (lambda (filename)))
2580     (sys-rename (lambda (old-filename new-filename)))
2581     (sys-rmdir (lambda (dirname)))
2582     (sys-select (lambda (read-filenos write-filenos execpt-filenos :optional timeout-x)))
2583     (sys-select! (lambda (read-filenos write-filenos execpt-filenos :optional timeout-x)))
2584     (sys-setenv (lambda (name string)))
2585     (sys-setgid (lambda (gid)))
2586     (sys-setlocale (lambda (locale-string)))
2587     (sys-setpgid (lambda (gid)))
2588     (sys-setsid (lambda ()))
2589     (sys-setuid (lambda (uid)))
2590     (sys-sigmask (lambda ((set how SIG_SETMASK SIG_BLOCK SIG_UNBLOCK) sigset)))
2591     (sys-signal-name (lambda (n)))
2592     (sys-sigset (lambda (n |...|) sigset))
2593     (sys-sigset-add! (lambda (sigset n)))
2594     (sys-sigset-delete! (lambda (sigset n)))
2595     (sys-sigset-empty! (lambda (sigset)))
2596     (sys-sigset-fill! (lambda (sigset)))
2597     (sys-sigsuspend (lambda (sigset)))
2598     (sys-sigwait (lambda (sigset)))
2599     (sys-sleep (lambda (x)))
2600     (sys-srandom (lambda (n)))
2601     (sys-stat (lambda (filename)))
2602;; deprecated
2603;;      (sys-stat->atime (lambda ()))
2604;;      (sys-stat->ctime (lambda ()))
2605;;      (sys-stat->dev (lambda ()))
2606;;      (sys-stat->file-type (lambda ()))
2607;;      (sys-stat->gid (lambda ()))
2608;;      (sys-stat->ino (lambda ()))
2609;;      (sys-stat->mode (lambda ()))
2610;;      (sys-stat->mtime (lambda ()))
2611;;      (sys-stat->nlink (lambda ()))
2612;;      (sys-stat->rdev (lambda ()))
2613;;      (sys-stat->size (lambda ()))
2614;;      (sys-stat->type (lambda ()))
2615;;      (sys-stat->uid (lambda ()))
2616     (sys-strerror (lambda (errno) string))
2617     (sys-strftime (lambda (format-string time)))
2618     (sys-symlink (lambda (old-filename new-filename)))
2619     (sys-system (lambda (command) n))
2620     (sys-time (lambda () n))
2621     (sys-times (lambda () list))
2622;;      (sys-tm->alist (lambda ()))
2623     (sys-tmpnam (lambda () string))
2624     (sys-truncate (lambda (filename n)))
2625     (sys-ttyname (lambda (port-or-fileno) string))
2626     (sys-uid->user-name (lambda (uid) name))
2627     (sys-umask (lambda () n))
2628     (sys-uname (lambda () string))
2629     (sys-unlink (lambda (filename)))
2630     (sys-unsetenv (lambda (name)))
2631     (sys-user-name->uid (lambda (name) uid))
2632     (sys-utime (lambda (filename)))
2633     (sys-wait (lambda ()))
2634     (sys-wait-exit-status (lambda (n) n))
2635     (sys-wait-exited? (lambda (n) bool))
2636     (sys-wait-signaled? (lambda (n) bool))
2637     (sys-wait-stopped? (lambda (n) bool))
2638     (sys-wait-stopsig (lambda (n) n))
2639     (sys-wait-termsig (lambda (n) n))
2640     (sys-waitpid (lambda (pid)))
2641     (tanh (lambda (z) z))
2642     (time (syntax))
2643     (time->seconds (lambda (time) x))
2644     (time? (lambda (obj) bool))
2645     (toplevel-closure? (lambda (obj) bool))
2646     (touch-instance! (lambda ()))
2647     (ucs->char (lambda (n) ch))
2648     (undefined (lambda () undefined))
2649     (undefined? (lambda (obj) bool))
2650     (unless (syntax))
2651     (until (syntax))
2652     (unwrap-syntax (lambda (obj)))
2653     (update! (syntax))
2654     (update-direct-method! (lambda ()))
2655     (update-direct-subclass! (lambda ()))
2656     (use (special gauche-available-modules))
2657     (use-version (syntax))
2658     (values-ref (syntax))
2659     (vector-copy (lambda (vector :optional start end fill) vector))
2660     (vm-dump (lambda () undefined))
2661     (vm-get-stack-trace (lambda () undefined))
2662     (vm-get-stack-trace-lite (lambda () undefined))
2663     (vm-set-default-exception-handler (lambda (handler) undefined))
2664     (warn (lambda (message-str args) undefined))
2665     (weak-vector-length (lambda (vector) n))
2666     (weak-vector-ref (lambda (vector i)))
2667     (weak-vector-set! (lambda (vector i value) undefined))
2668     (when (syntax))
2669     (while (syntax))
2670     (with-error-handler (lambda (handler thunk)))
2671     (with-error-to-port (lambda (port thunk)))
2672     (with-exception-handler (lambda (handler thunk)))
2673     (with-input-from-port (lambda (port thunk)))
2674     (with-input-from-string (lambda (string thunk)))
2675     (with-module (syntax))
2676     (with-output-to-port (lambda (port thunk)))
2677     (with-output-to-string (lambda (thunk) string))
2678     (with-port-locking (lambda (port thunk)))
2679     (with-ports (lambda (input-port output-port error-port thunk)))
2680     (with-signal-handlers (syntax))
2681     (with-string-io (lambda (string thunk) string))
2682     (write* (lambda (obj :optional output-port) undefined))
2683     (write-byte (lambda (n :optional output-port) undefined))
2684     (write-limited (lambda (obj :optional output-port)))
2685     (write-object (lambda (obj output-port)))
2686     (write-to-string (lambda (obj) string))
2687     (write-with-shared-structure (lambda (obj :optional output-port)))
2688     (write/ss (lambda (obj :optional output-port)))
2689     (x->integer (lambda (obj) integer))
2690     (x->number (lambda (obj) number))
2691     (x->string (lambda (obj) string))
2692     )))
2693
2694;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2695;; special lookups (XXXX add more impls, try to abstract better)
2696
2697(defvar *chicken-base-repo*
2698  (or (getenv "CHICKEN_REPOSITORY")
2699      (let ((dir
2700             (car (remove-if-not #'file-directory-p
2701                                 '("/usr/lib/chicken"
2702                                   "/usr/local/lib/chicken"
2703                                   "/opt/lib/chicken"
2704                                   "/opt/local/lib/chicken")))))
2705        (and dir
2706             (car (reverse (sort (directory-files dir t "^[0-9]+$")
2707                                 #'string-lessp)))))
2708      (and (fboundp 'shell-command-to-string)
2709           (let* ((res (shell-command-to-string "chicken-setup -R"))
2710                  (res (substring res 0 (- (length res) 1))))
2711             (and res (file-directory-p res) res)))
2712      "/usr/local/lib/chicken"))
2713
2714(defvar *chicken-repo-dirs*
2715  (remove-if-not
2716   #'(lambda (x) (and (stringp x) (not (equal x ""))))
2717   (let ((home (getenv "CHICKEN_HOME")))
2718     (if (and home (not (equal home "")))
2719         (let ((res (split-string home ";")))
2720           (if (member *chicken-repo-dirs* res)
2721               res
2722             (cons *chicken-repo-dirs* res))) 
2723       (list *chicken-base-repo*)))))
2724
2725(defun chicken-available-modules (&optional sym)
2726  (append
2727   (mapcar 'symbol-name (mapcar 'car *scheme-chicken-modules*))
2728   (append-map
2729    #'(lambda (dir)
2730        (mapcar
2731         'file-name-sans-extension
2732         (directory-files dir nil ".*\\.\\(so\\|scm\\)$" t)))
2733    *chicken-repo-dirs*)))
2734
2735(defvar *gauche-repo-path*
2736  (or (car (remove-if-not #'file-directory-p
2737                          '("/usr/share/gauche"
2738                            "/usr/local/share/gauche"
2739                            "/opt/share/gauche"
2740                            "/opt/local/share/gauche")))
2741      (and (fboundp 'shell-command-to-string)
2742           (let* ((res (shell-command-to-string "gauche-config --syslibdir"))
2743                  (res (substring res 0 (- (length res) 1))))
2744             (and res (file-directory-p res) res)))
2745      "/usr/local/share/gauche"))
2746
2747(defvar *gauche-site-repo-path*
2748  (concat *gauche-repo-path* "/site/lib"))
2749
2750(defun gauche-available-modules (&optional sym)
2751  (let ((version-dir (concat
2752                      (car (directory-files *gauche-repo-path* t "^[0-9]"))
2753                      "/lib"))
2754        (site-dir *gauche-site-repo-path*)
2755        (other-dirs
2756         (remove-if-not
2757          #'file-directory-p
2758          (split-string (or (getenv "GAUCHE_LOAD_PATH") "") ":"))))
2759    (mapcar
2760     #'(lambda (f) (subst-char-in-string ?/ ?. f))
2761     (mapcar
2762      #'file-name-sans-extension
2763      (append-map
2764       #'(lambda (dir)
2765           (let ((len (length dir)))
2766             (mapcar #'(lambda (f) (substring f (+ 1 len)))
2767                     (directory-tree-files dir t "\\.scm"))))
2768       (cons version-dir (cons site-dir other-dirs)))))))
2769
2770;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2771;; utilities
2772
2773(defun append-map (proc init-ls)
2774  (if (null init-ls)
2775      '()
2776    (let* ((ls (reverse init-ls))
2777           (res (funcall proc (pop ls))))
2778      (while (consp ls)
2779        (setq res (append (funcall proc (pop ls)) res)))
2780      res)))
2781
2782(defun flatten (ls)
2783  (cond
2784   ((consp ls) (cons (car ls) (flatten (cdr ls))))
2785   ((null ls) '())
2786   (t (list ls))))
2787
2788(defun scheme-in-string-p ()
2789  (let ((orig (point)))
2790    (save-excursion
2791      (beginning-of-defun)
2792      (let ((parses (parse-partial-sexp (point) orig)))
2793        (nth 3 parses)))))
2794
2795(defun scheme-beginning-of-sexp ()
2796  (let ((syn (char-syntax (char-before (point)))))
2797    (if (or (eq syn ?\()
2798            (and (eq syn ?\") (scheme-in-string-p)))
2799        (forward-char -1)
2800      (forward-sexp -1))))
2801
2802(defun find-file-in-path (file path)
2803  (car (remove-if-not
2804        #'(lambda (dir) (file-exists-p (concat dir file)))
2805        path)))
2806
2807;; visit a file and kill the buffer only if it wasn't already open
2808(defmacro with-find-file (path-expr &rest body)
2809  (let ((path (gensym))
2810        (buf (gensym))
2811        (res (gensym)))
2812    `(save-window-excursion
2813       (let* ((,path (file-truename ,path-expr))
2814              (,buf (find-if #'(lambda (x) (equal ,path (buffer-file-name x)))
2815                             (buffer-list))))
2816         (if ,buf
2817             (switch-to-buffer ,buf)
2818           (find-file ,path))
2819         (let ((,res (save-excursion ,@body)))
2820           (unless ,buf (kill-buffer (current-buffer)))
2821           ,res)))))
2822
2823(defun directory-tree-files (init-dir &optional full match)
2824  (let ((res '())
2825        (stack (list init-dir)))
2826    (while (consp stack)
2827      (let* ((dir (pop stack))
2828             (files (cddr (directory-files dir full))))
2829        (setq res (append (if match
2830                              (remove-if-not
2831                               #'(lambda (f) (string-match match f))
2832                               files)
2833                            files)
2834                          res))
2835        (setq stack
2836              (append
2837               (remove-if-not 'file-directory-p
2838                              (if full
2839                                  files
2840                                (mapcar #'(lambda (f) (concat dir "/" f))
2841                                        files)))
2842               stack))))
2843    res))
2844
2845;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2846;; sexp manipulation
2847
2848;; returns current argument position within sexp
2849(defun beginning-of-current-sexp-operator ()
2850  (let ((pos 0))
2851    (skip-syntax-backward "w_")
2852    (while (and (not (bobp)) (not (eq ?\( (char-before))))
2853      (scheme-beginning-of-sexp)
2854      (incf pos))
2855    pos))
2856
2857(defun beginning-of-next-sexp ()
2858  (forward-sexp 2)
2859  (backward-sexp 1))
2860
2861(defun beginning-of-string ()
2862  (interactive)
2863  (search-backward "\"" nil t)
2864  (while (and (> (point) (point-min)) (eq ?\\ (char-before)))
2865    (search-backward "\"" nil t)))
2866
2867;; for the enclosing sexp, returns a cons of the leading symbol (if
2868;; any) and the current position within the sexp (starting at 0)
2869(defun enclosing-sexp-prefix ()
2870  (save-excursion
2871    (let ((pos (beginning-of-current-sexp-operator)))
2872      (cons (scheme-symbol-at-point) pos))))
2873
2874(defun enclosing-2-sexp-prefixes ()
2875  (save-excursion
2876    (let* ((pos1 (beginning-of-current-sexp-operator))
2877           (sym1 (scheme-symbol-at-point)))
2878      (backward-char)
2879      (or
2880       (ignore-errors
2881         (let ((pos2 (beginning-of-current-sexp-operator)))
2882           (list sym1 pos1 (scheme-symbol-at-point) pos2)))
2883       (list sym1 pos1 nil 0)))))
2884
2885;; sexp-at-point is always fragile, both because the user can input
2886;; incomplete sexps and because some scheme sexps are not valid elisp
2887;; sexps.  this is one of the few places we use it, so we're careful
2888;; to wrap it in ignore-errors.
2889(defun nth-sexp-at-point (n)
2890  (ignore-errors
2891    (save-excursion
2892      (forward-sexp (+ n 1))
2893      (let ((end (point)))
2894        (forward-sexp -1)
2895        (car (read-from-string (buffer-substring (point) end)))))))
2896
2897(defun scheme-symbol-at-point ()
2898  (save-excursion
2899    (skip-syntax-backward "w_")
2900    (let ((start (point)))
2901      (skip-syntax-forward "w_")
2902      (and (< start (point))
2903           (intern (buffer-substring start (point)))))))
2904
2905(defun goto-next-top-level ()
2906  (or (re-search-forward "^(" nil t)
2907      (goto-char (point-max))))
2908
2909;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2910;; variable extraction
2911
2912(defun let-vars-at-point (&optional env)
2913  (let ((end (save-excursion (forward-sexp) (point)))
2914        (vars '()))
2915    (forward-char 1)
2916    (while (< (point) end)
2917      (when (eq ?\( (char-after))
2918        (save-excursion
2919          (forward-char 1)
2920          (if (eq ?w (char-syntax (char-after)))
2921              (let ((sym (scheme-symbol-at-point)))
2922                (beginning-of-next-sexp)
2923                (let ((c (char-syntax (char-after))))
2924                  (case c
2925                    ((?\")
2926                     (push (list sym 'string) vars))
2927                    ((?\()
2928                     (forward-char 1)
2929                     (if (eq ?w (char-syntax (char-after)))
2930                         (let ((op (scheme-symbol-at-point)))
2931                           (cond
2932                            ((eq op 'lambda)
2933                             (let ((params
2934                                    (nth-sexp-at-point 1)))
2935                               (push (list sym `(lambda ,params)) vars)))
2936                            (t
2937                             (let ((spec (scheme-env-lookup env op)))
2938                               (if (and spec
2939                                        (consp (cadr spec))
2940                                        (eq 'lambda (caadr spec))
2941                                        (cddadr spec))
2942                                   (push (list sym (car (cddadr spec))) vars)
2943                                 (push (list sym) vars))))))
2944                       (push (list sym) vars)))
2945                    (t
2946                     (push (list sym) vars))))))))
2947      (or (ignore-errors (progn (beginning-of-next-sexp) t))
2948          (goto-char end)))
2949    (reverse vars)))
2950
2951(defun extract-match-clause-vars (x)
2952  (cond
2953   ((null x) '())
2954   ((symbolp x)
2955    (if (memq x '(_ ___ |...|))
2956        '()
2957      (list x)))
2958   ((consp x)
2959    (case (car x)
2960      ((and or not)
2961       (extract-match-clause-vars (cdr x)))
2962      ((? = $)
2963       (if (consp (cdr x)) (extract-match-clause-vars (cddr x)) '()))
2964      ((get! set!)
2965       (if (consp (cdr x)) (extract-match-clause-vars (cadr x)) '()))
2966      ((quote) '())
2967      ((quasiquote) '()) ; XXXX
2968      (t (union (extract-match-clause-vars (car x))
2969                (extract-match-clause-vars (cdr x))))))
2970   ((vectorp x)
2971    (extract-match-clause-vars (concatenate 'list x)))
2972   (t
2973    '())))
2974
2975(defun extract-match-vars (ls)
2976  (apply 'append (mapcar 'extract-match-clause-vars
2977                         (mapcar 'car (remove-if-not 'consp ls)))))
2978
2979;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2980;; You can set the *default-scheme-implementation* to your preferred
2981;; implementation, for when we can't figure out the file from
2982;; heuristics.  Alternately, in any given buffer, just
2983;;
2984;; (setq *current-scheme-implementation* whatever)
2985
2986(defvar *current-scheme-implementation* nil)
2987(make-variable-buffer-local '*current-scheme-implementation*)
2988
2989(defvar *default-scheme-implementation* 'chicken)
2990
2991(defvar *scheme-interpreter-alist*
2992  '(("csi" . chicken)
2993    ("gosh" . gauche)
2994    ("gsi" . gambit)
2995    ))
2996
2997(defun current-scheme-implementation ()
2998  (unless *current-scheme-implementation*
2999    (setq *current-scheme-implementation*
3000          (save-excursion
3001            (goto-char (point-min))
3002            (or (if (looking-at "#! *\\([^ ]+\\)")
3003                    (let ((script (file-name-nondirectory (match-string 1))))
3004                      (or (cdr (assoc script *scheme-interpreter-alist*))
3005                          (intern script))))
3006                (cond
3007                 ((re-search-forward "(define-module +\\(.\\)" nil t)
3008                  (if (equal "(" (match-string 1))
3009                      'guile
3010                    'gauche))
3011                 ((re-search-forward "(use " nil t)
3012                  'chicken)
3013                 ((re-search-forward "(module " nil t)
3014                  'mzscheme))))))
3015  (or *current-scheme-implementation*
3016      *default-scheme-implementation*))
3017
3018;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3019
3020(defun current-local-vars (&optional env)
3021  (let ((vars '())
3022        (limit (save-excursion (beginning-of-defun) (+ (point) 1))))
3023    (save-excursion
3024      (while (> (point) limit)
3025        (or (ignore-errors
3026              (progn
3027                (skip-chars-backward " \t\n" limit)
3028                (scheme-beginning-of-sexp)
3029                t))
3030            (goto-char limit))
3031        (when (and (> (point) (point-min))
3032                   (eq ?\( (char-syntax (char-before (point))))
3033                   (eq ?w (char-syntax (char-after (point)))))
3034          (let ((sym (scheme-symbol-at-point)))
3035            ;; XXXX handle internal defines
3036            (case sym
3037              ((lambda)
3038               (setq vars
3039                     (append (mapcar #'list (flatten (nth-sexp-at-point 1)))
3040                             vars)))
3041              ((match)
3042               (setq vars (append
3043                           (mapcar #'list
3044                                   (flatten (extract-match-vars
3045                                             (nth-sexp-at-point 2))))
3046                           vars)))
3047              ((match-let match-let*)
3048               (setq vars (append (mapcar #'list
3049                                          (flatten (extract-match-vars
3050                                                    (nth-sexp-at-point 1))))
3051                                 vars)))
3052              ((let let* letrec letrec* let-syntax letrec-syntax and-let* do)
3053               (save-excursion
3054                 (beginning-of-next-sexp)
3055                 (if (and (eq sym 'let)
3056                          (eq ?w (char-syntax (char-after (point)))))
3057                     ;; named let
3058                     (let* ((sym (scheme-symbol-at-point))
3059                            (args (progn
3060                                    (beginning-of-next-sexp)
3061                                    (let-vars-at-point env))))
3062                       (setq vars (cons `(,sym (lambda ,(mapcar #'car args)))
3063                                        (append args vars))))
3064                   (setq vars (append (let-vars-at-point env) vars)))))
3065              ((let-values let*-values)
3066               (setq vars
3067                     (append (mapcar
3068                              #'list
3069                              (append-map
3070                               #'flatten
3071                               (remove-if-not 'consp (nth-sexp-at-point 1))))
3072                             vars)))
3073              ((receive defun defmacro)
3074               (setq vars
3075                     (append (mapcar #'list (flatten (nth-sexp-at-point 1)))
3076                             vars)))
3077              (t
3078               (when (string-match "^define\\(-.*\\)?" (symbol-name sym))
3079                 (setq vars
3080                       (append (mapcar #'list (flatten (nth-sexp-at-point 1)))
3081                               vars)))))
3082            ))))
3083    (reverse vars)))
3084
3085(defun extract-import-module-name (sexp &optional mzschemep)
3086  (case (car sexp)
3087    ((prefix)
3088     (extract-import-module-name (if mzschemep (caddr sexp) (cadr sexp))))
3089    ((prefix-all-except)
3090     (extract-import-module-name (caddr sexp)))
3091    ((for only except rename lib library)
3092     (extract-import-module-name (cadr sexp) mzschemep))
3093    ((import)
3094     (extract-import-module-name (cadr sexp) mzschemep))
3095    ((require)
3096     (extract-import-module-name (cadr sexp) t))
3097    (t sexp)))
3098
3099(defun extract-import-module-imports (sexp &optional mzschemep)
3100  (case (car sexp)
3101    ((prefix)
3102     (let* ((ids (extract-import-module-name
3103                  (if mzschemep (caddr sexp) (cadr sexp))
3104                  mzschemep))
3105            (prefix0 (if mzschemep (cadr sexp) (caddr sexp)))
3106            (prefix (if (symbolp prefix0) (symbol-name prefix0) prefix0)))
3107       (mapcar #'(lambda (x) (intern (concat prefix (symbol-name x)))) ids)))
3108    ((prefix-all-except)
3109     (let ((prefix
3110            (if (symbolp (cadr sexp)) (symbol-name (cadr sexp)) (cadr sexp)))
3111           (exceptions (cddr sexp)))
3112       (mapcar #'(lambda (x)
3113                   (if (memq x exceptions)
3114                       x
3115                     (intern (concat prefix (symbol-name x)))))
3116               (extract-import-module-name (caddr sexp) t))))
3117    ((for)
3118     (extract-import-module-name (cadr sexp) mzschemep))
3119    ((rename)
3120     (if mzschemep
3121         (list (caddr sexp))
3122       (mapcar 'cadr (cddr sexp))))
3123    ((except)
3124     (remove-if #'(lambda (x) (memq x (cddr sexp)))
3125                (extract-import-module-imports (cadr sexp) mzschemep)))
3126    ((only)
3127     (cddr sexp))
3128    ((import)
3129     (extract-import-module-imports (cadr sexp) mzschemep))
3130    ((require for-syntax)
3131     (extract-import-module-imports (cadr sexp) t))
3132    ((library)
3133     (if (and (stringp (cadr sexp)) (file-exists-p (cadr sexp)))
3134         (scheme-module-exports (intern (cadr sexp)))))
3135    ((lib)
3136     (if (and (equal "srfi" (caddr sexp))
3137              (stringp (cadr sexp))
3138              (string-match "^[0-9]+\\." (cadr sexp)))
3139         (scheme-module-exports
3140          (intern (file-name-sans-extension (concat "srfi-" (cadr sexp)))))
3141       (scheme-module-exports
3142        (intern (apply 'concat (append (cddr sexp) (list (cadr sexp))))))))
3143    (t sexp)))
3144
3145(defun extract-sexp-imports (sexp)
3146  (case (car sexp)
3147    ((begin)
3148     (append-map #'extract-sexp-imports (cdr sexp)))
3149    ((cond-expand)
3150     (append-map #'extract-sexp-imports (append-map #'cdr (cdr sexp))))
3151    ((use require-extension)
3152     (append-map #'scheme-module-exports (cdr sexp)))
3153    ((library module)
3154     (append-map #'extract-import-module-imports
3155                 (remove-if #'(lambda (x) (memq (car x) '(import require)))
3156                            (cdr sexp))))
3157    (t '())))
3158
3159(defun module-symbol-p (sym)
3160  (memq sym '(use require require-extension begin cond-expand
3161              module library define-module)))
3162
3163(defun skip-shebang ()
3164  ;; skip shebang if present
3165  (if (looking-at "#!")
3166      ;; guile skips until a closing !#
3167      (if (eq 'guile (current-scheme-implementation))
3168          (re-search-forward "!#" nil t)
3169        (next-line))))
3170
3171(defun current-scheme-imports ()
3172  (let ((imports '()))
3173    (save-excursion
3174      (goto-char (point-min))
3175      (skip-shebang)
3176      ;; scan for module forms
3177      (while (not (eobp))
3178        (if (ignore-errors (progn (forward-sexp) t))
3179            (let ((end (point)))
3180              (backward-sexp)
3181              (when (eq ?\( (char-after))
3182                (forward-char)
3183                (when (and (not (eq ?\( (char-after)))
3184                           (module-symbol-p (scheme-symbol-at-point)))
3185                  (backward-char)
3186                  (ignore-errors
3187                    (setq imports
3188                          (append (extract-sexp-imports (nth-sexp-at-point 0))
3189                                  imports)))))
3190              (goto-char end))
3191          ;; if an incomplete sexp is found, try to recover at the
3192          ;; next line beginning with an open paren
3193          (goto-next-top-level))))
3194    imports))
3195
3196(defun name-of-define (sexp)
3197  (if (consp (cadr sexp)) (caadr sexp) (cadr sexp)))
3198
3199(defun scheme-top-definitions (sexp)
3200  (let ((defs '())
3201        (stack (list sexp)))
3202    (while (consp stack)
3203      (let ((sexp (pop stack)))
3204        (when (and (consp sexp) (consp (cdr sexp)))
3205          (case (car sexp)
3206            ((define-syntax defmacro define-macro)
3207             (push (list (name-of-define sexp) '(syntax)) defs))
3208            ((define define-inline define-constant defun)
3209             (push (list (name-of-define sexp)
3210                         (if (or (eq 'defun (car sexp))
3211                                 (consp (cadr sexp))
3212                                 (and (consp (caddr sexp))
3213                                      (eq 'lambda (caaddr sexp))))
3214                             (cond
3215                              ((eq 'defun (car sexp))
3216                               `(lambda ,(caddr sexp)))
3217                              ((consp (cadr sexp))
3218                               `(lambda ,(cdadr sexp)))
3219                              (t
3220                               `(lambda ,(car (cdaddr sexp)))))
3221                             'object))
3222                   defs))
3223            ((defvar define-class)
3224             (push (list (name-of-define sexp) 'non-procedure) defs))
3225            ((define-record-type)
3226             (setq defs
3227                   (cons (list (caddr sexp) 'procedure)
3228                         (cons (list (cadddr sexp) 'procedure)
3229                               (append (append-map #'(lambda (x)
3230                                                   (list (cdr x) 'procedure))
3231                                               (cdddr sexp))
3232                                       defs)))))
3233            ((begin progn)
3234             (setq stack (append (cdr sexp) stack)))
3235            ((cond-expand)
3236             (setq stack (append-map #'cdr (cdr sexp))))
3237            (t
3238             '())))))
3239    defs))
3240
3241(defun current-scheme-globals ()
3242  (let ((globals '()))
3243    (save-excursion
3244      (goto-char (point-min))
3245      (while (not (eobp))
3246        (if (ignore-errors (progn (forward-sexp) t))
3247            (setq globals
3248                  ;; XXXX avoid reading whole top-level form
3249                  (append (scheme-top-definitions (nth-sexp-at-point 0))
3250                          globals))
3251          (goto-next-top-level))))
3252    globals))
3253
3254(defun scheme-module-exports (mod)
3255  (if (not (symbolp mod))
3256      '()
3257    (cond
3258     ((string-match "^srfi-" (symbol-name mod))
3259      (let ((i (string-to-number (substring (symbol-name mod) 5))))
3260        (and (< i (length *scheme-srfi-info*))
3261             (let ((info (cdr (aref *scheme-srfi-info* i))))
3262               (if (and (consp info) (null (cdr info)) (symbolp (car info)))
3263                   (scheme-module-exports (car info))
3264                 info)))))
3265     (t
3266      (case (current-scheme-implementation)
3267        ((chicken)
3268         (let ((predefined (assq mod *scheme-chicken-modules*)))
3269          (if predefined
3270              (cdr predefined) 
3271            (let ((path (concat "/usr/local/lib/chicken/1/"
3272                                (symbol-name mod)
3273                                ".exports")))
3274              (if (not (file-exists-p path))
3275                  '()
3276                (with-find-file path
3277                  (let ((vars '()))
3278                    (condition-case nil
3279                        (while (not (eobp))
3280                          (forward-sexp)
3281                          (let ((sym (nth-sexp-at-point 0)))
3282                            (if sym (push (list sym) vars))))
3283                      (error (goto-char (point-max))))
3284                    vars)))))))
3285        ((gauche)
3286         (let ((path (find-file-in-path
3287                      (concat (subst-char-in-string ?. ?/ (symbol-name mod))
3288                              ".scm")
3289                      (list (concat
3290                             (car (directory-files
3291                                   "/usr/local/share/gauche/"
3292                                   t
3293                                   "^[0-9]"))
3294                             "/lib")
3295                            "/usr/local/share/gauche/site/lib"))))
3296           (if (not (file-exists-p path))
3297               '()
3298             ;; XXXX parse, don't use regexps
3299             (with-find-file path
3300               (when (re-search-forward "(export" nil t)
3301                 (backward-sexp)
3302                 (backward-char)
3303                 (mapcar #'list (cdr (ignore-errors
3304                                       (nth-sexp-at-point 0)))))))))
3305        ((mzscheme)
3306         (let ((path (find-file-in-path
3307                      (symbol-name mod)
3308                      '("."
3309                        "/usr/local/lib/plt/collects"
3310                        "/usr/local/lib/plt/collects/mzlib"))))
3311           (if (not (file-exists-p path))
3312               '()
3313             ;; XXXX parse, don't use regexps
3314             (with-find-file path
3315               (when (re-search-forward "(provide" nil t)
3316                 (backward-sexp)
3317                 (backward-char)
3318                 (mapcar #'list (cdr (ignore-errors
3319                                       (nth-sexp-at-point 0)))))))))
3320        (t '()))))))
3321
3322;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3323
3324(defun scheme-translate-type (type)
3325  (if (not (symbolp type))
3326      type
3327    (case type
3328      ((pred proc thunk handler dispatch producer consumer f fn g kons)
3329       'procedure)
3330      ((num) 'number)
3331      ((z) 'complex)
3332      ((x y timeout seconds nanoseconds) 'real)
3333      ((i j k n m int index size count len length bound nchars start end
3334        pid uid gid fd fileno errno)
3335       'integer)
3336      ((ch) 'char)
3337      ((str name pattern) 'string)
3338      ((file path pathname) 'filename)
3339      ((dir dirname) 'directory)
3340      ((sym id identifier) 'symbol)
3341      ((ls alist lists) 'list)
3342      ((vec) 'vector)
3343      ((exc excn err error) 'exception)
3344      ((ptr) 'pointer)
3345      ((bool) 'boolean)
3346      ((env) 'environment)
3347      ((char string boolean number complex real integer procedure char-set
3348        port input-port output-port pair list vector array stream hash-table
3349        thread mutex condition-variable time exception date duration locative
3350        random-source state condition condition-type queue sequence pointer
3351        u8vector s8vector u16vector s16vector u32vector s32vector
3352        u64vector s64vector f32vector f64vector undefined symbol
3353        block filename directory mmap listener environment non-procedure
3354        read-table continuation blob generic method class regexp regmatch
3355        sys-stat fdset)
3356       type)
3357      ((parent seed option mode) 'non-procedure)
3358      (t
3359       (let* ((str (symbol-name type))
3360              (i (string-match "-?[0-9]+$" str)))
3361         (if i
3362             (scheme-translate-type (intern (substring str 0 i)))
3363           (let ((i (string-match "-\\([^-]+\\)$" str)))
3364             (if i
3365                 (scheme-translate-type (intern (substring str (+ i 1))))
3366               (if (string-match "\\?$" str)
3367                   'boolean
3368                 'object)))))))))
3369
3370(defun scheme-lookup-type (spec pos)
3371  (let ((i 1)
3372        (type nil))
3373    (while (and (consp spec) (< i pos))
3374      (cond
3375        ((eq :optional (car spec))
3376         (decf i))
3377        ((eq '|...| (cadr spec))
3378         (setq type (car spec))
3379         (setq spec nil)))
3380      (setq spec (cdr spec))
3381      (incf i))
3382    (if (and (not type) (= i pos))
3383        (setq type (car (remove ':optional spec))))
3384    (if type
3385        (setq type (scheme-translate-type type)))
3386    type))
3387
3388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3389;; completion
3390
3391(eval-when (compile load eval)
3392  (unless (fboundp 'event-matches-key-specifier-p)
3393    (defalias 'event-matches-key-specifier-p 'eq)))
3394
3395(unless (fboundp 'read-event)
3396  (defun read-event ()
3397    (aref (read-key-sequence nil) 0)))
3398
3399(defun do-completion (str coll &optional strs pred)
3400  (let* ((coll (mapcar #'(lambda (x)
3401                           (cond
3402                            ((symbolp x) (list (symbol-name x)))
3403                            ((stringp x) (list x))
3404                            (t x)))
3405                       coll))
3406         (completion1 (try-completion str coll pred))
3407         (completion2 (and strs (try-completion str strs pred)))
3408         (completion (if (and completion2
3409                              (or (not completion1)
3410                                  (< (length completion2)
3411                                     (length completion1))))
3412                         completion2
3413                       completion1)))
3414    (cond
3415     ((eq completion t))
3416     ((not completion)
3417      (message "Can't find completion for \"%s\"" str)
3418      (ding))
3419     ((not (string= str completion))
3420      (unless (equal completion completion1)
3421        (save-excursion
3422          (backward-char (length str))
3423          (insert "\"")))
3424      (insert (substring completion (length str)))
3425      (unless (equal completion completion1)
3426        (insert "\"")
3427        (backward-char)))
3428     (t
3429      (let ((win-config (current-window-configuration))
3430            (done nil))
3431        (message "Hit space to flush")
3432        (with-output-to-temp-buffer "*Completions*"
3433          (display-completion-list
3434           (sort (all-completions str (append strs coll) pred) 'string-lessp)))
3435        (while (not done)
3436          (let ((event
3437                 (with-current-buffer (get-buffer "*Completions*")
3438                   (read-event))))
3439            (cond
3440             ((or (event-matches-key-specifier-p event 'tab)
3441                  (event-matches-key-specifier-p event 9))
3442              (save-selected-window
3443                (select-window (get-buffer-window "*Completions*"))
3444                (if (pos-visible-in-window-p (point-max))
3445                    (goto-char (point-min))
3446                  (scroll-up))))
3447             (t
3448              (set-window-configuration win-config)
3449              (if (or (event-matches-key-specifier-p event 'space)
3450                      (event-matches-key-specifier-p event 32))
3451                  (bury-buffer (get-buffer "*Completions*"))
3452                (setq unread-command-events (list event)))
3453              (setq done t))))))
3454      ))))
3455
3456(defun scheme-env-lookup (env sym)
3457  (let ((spec nil)
3458        (ls env))
3459    (while (and ls (not spec))
3460      (setq spec (assq sym (pop ls))))
3461    spec))
3462
3463(defun scheme-current-env ()
3464  ;; r5rs
3465  (let ((env (list *scheme-r5rs-info*)))
3466    ;; base language
3467    (let ((base (cdr (assq (current-scheme-implementation)
3468                           *scheme-implementation-exports*))))
3469      (if base (push base env)))
3470    ;; imports
3471    (let ((imports (current-scheme-imports)))
3472      (if imports (push imports env)))
3473    ;; top-level defs
3474    (let ((top (current-scheme-globals)))
3475      (if top (push top env)))
3476    ;; current local vars
3477    (let ((locals (current-local-vars env)))
3478      (if locals (push locals env)))
3479    env))
3480
3481(defun scheme-env-filter (pred env)
3482  (mapcar #'car
3483          (apply #'concatenate
3484                 'list
3485                 (mapcar #'(lambda (e) (remove-if-not pred e))
3486                         env))))
3487
3488;; checking return values
3489(defun scheme-type-match-p (a b)
3490  (let ((a1 (scheme-translate-type a))
3491        (b1 (scheme-translate-type b)))
3492    (and (not (eq a1 'undefined))
3493         (or (eq a1 b1)
3494             (eq a1 'object)
3495             (case b1
3496               ((object) t)
3497               ((number) (memq a1 '(complex real rational integer)))
3498               ((complex) (memq a1 '(real rational integer)))
3499               ((real) (memq a1 '(rational integer)))
3500               ((rational) (memq a1 '(integer)))
3501               ((port) (memq a1 '(input-port output-port)))
3502               ((string) (memq a1 '(filename directory)))
3503               (t nil))))))
3504
3505(defun scheme-smart-complete (&optional arg)
3506  (interactive "P")
3507  (let* ((end (point))
3508         (start (save-excursion (skip-syntax-backward "w_") (point)))
3509         (sym (buffer-substring-no-properties start end))
3510         (in-str-p (scheme-in-string-p))
3511         (x (save-excursion
3512              (if in-str-p (beginning-of-string))
3513              (enclosing-2-sexp-prefixes)))
3514         (inner-proc (car x))
3515         (inner-pos (cadr x))
3516         (outer-proc (caddr x))
3517         (outer-pos (cadddr x))
3518         (env (save-excursion
3519                (if in-str-p (beginning-of-string))
3520                (scheme-current-env)))
3521         (outer-spec (scheme-env-lookup env outer-proc))
3522         (outer-type (scheme-translate-type (cadr outer-spec)))
3523         (inner-spec (scheme-env-lookup env inner-proc))
3524         (inner-type (scheme-translate-type (cadr inner-spec))))
3525    (cond
3526     ;; return all env symbols when a prefix arg is given
3527     (arg
3528      (do-completion sym (scheme-env-filter #'(lambda (x) t) env)))
3529     ;; for now just do file-name completion in strings
3530     (in-str-p
3531      (let ((file (file-name-nondirectory sym))
3532            (dir (or (file-name-directory sym) ".")))
3533        (do-completion file (file-name-all-completions file dir))))
3534     ;; outer special
3535     ((and (consp outer-type)
3536           (eq 'special (car outer-type))
3537           (caddr outer-type))
3538      (do-completion sym (funcall (caddr outer-type) sym)))
3539     ;; inner special
3540     ((and (consp inner-type)
3541           (eq 'special (car inner-type))
3542           (cadr inner-type))
3543      (do-completion sym (funcall (cadr inner-type) sym)))
3544     ;; completing inner procedure, complete procedures with a
3545     ;; matching return type
3546     ((and (consp outer-type)
3547           (eq 'lambda (car outer-type))
3548           (not (zerop outer-pos))
3549           (nth outer-pos (cadr outer-type))
3550           (zerop inner-pos))
3551      (let ((ret-type (scheme-lookup-type (cadr outer-type) outer-pos)))
3552        (do-completion
3553         sym
3554         (scheme-env-filter
3555          #'(lambda (x)
3556              (let ((type (cadr x)))
3557                (or (memq type '(procedure object))
3558                    (and (consp type)
3559                         (or (and (eq 'syntax (car type))
3560                                  (not (eq 'undefined (caddr type))))
3561                             (and (eq 'lambda (car type))
3562                                  (scheme-type-match-p (caddr type)
3563                                                       ret-type)))))))
3564          env))))
3565     ;; completing a normal parameter
3566     ((and inner-proc
3567           (not (zerop inner-pos))
3568           (consp inner-type)
3569           (eq 'lambda (car inner-type)))
3570      (let* ((param-type (scheme-lookup-type (cadr inner-type) inner-pos))
3571             (set-or-flags-p (and (consp param-type)
3572                                  (memq (car param-type) '(set flags))))
3573             (base-type (if set-or-flags-p
3574                            (scheme-translate-type (cadr param-type))
3575                            param-type))
3576             (base-completions
3577              (scheme-env-filter
3578               #'(lambda (x)
3579                   (scheme-type-match-p base-type (cadr x)))
3580               env))
3581             (str-completions
3582              (case base-type
3583                ((filename directory)
3584                 (let* ((file (file-name-nondirectory sym))
3585                        (dir (or (file-name-directory sym) "."))
3586                        (ls (file-name-all-completions file dir)))
3587                   (if (eq base-type 'directory)
3588                       (remove-if-not
3589                        #'(lambda (x)
3590                            (file-directory-p (concat dir "/" x)))
3591                        ls)
3592                     ls)))
3593                (t '()))))
3594        (do-completion
3595         sym
3596         (append
3597          (if set-or-flags-p
3598              (cddr param-type)
3599            '())
3600          base-completions)
3601         str-completions)))
3602     ;; completing a function
3603     ((zerop inner-pos)
3604      (do-completion
3605       sym
3606       (scheme-env-filter
3607        #'(lambda (x)
3608            (or (memq x '(procedure object))
3609                (and (consp (cadr x))
3610                     (memq (caadr x) '(lambda syntax)))))
3611        env)))
3612     ;; complete everything
3613     (t
3614      (do-completion sym (scheme-env-filter #'(lambda (x) t) env)) ))))
3615
3616(defun scheme-complete-or-indent (&optional arg)
3617  (interactive "P")
3618  (let* ((end (point))
3619         (func
3620          (save-excursion
3621            (beginning-of-line)
3622            (if (re-search-forward "\\S-" end t)
3623                'scheme-smart-complete
3624              'lisp-indent-line))))
3625    (funcall func arg)))
3626
3627;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3628;; optional eldoc function
3629
3630(defun scheme-optional-in-brackets (ls)
3631  ;; stupid xemacs won't allow ... as a symbol
3632  (setq ls (mapcar #'(lambda (x) (if (eq x '|...|) "..." x)) ls))
3633  ;; put optional arguments inside brackets (via a vector)
3634  (if (memq :optional ls)
3635      (let ((res '()))
3636        (while (and (consp ls) (not (eq :optional (car ls))))
3637          (push (pop ls) res))
3638        (reverse (cons (apply #'vector (cdr ls)) res)))
3639    ls))
3640
3641(defun scheme-base-type (x)
3642  (if (not (consp x))
3643      x
3644    (case (car x)
3645      ((flags set) (or (cadr x) (car x)))
3646      ((lambda) 'procedure)
3647      ((syntax) 'syntax)
3648      (t x))))
3649
3650(defun sexp-to-string (sexp)
3651  (with-output-to-string (princ sexp)))
3652
3653(defun scheme-get-current-symbol-info ()
3654  (let* ((sym (eldoc-current-symbol))
3655         (fnsym (eldoc-fnsym-in-current-sexp))
3656         (env (save-excursion
3657                (if (scheme-in-string-p) (beginning-of-string))
3658                (scheme-current-env)))
3659         (spec (or (and sym (scheme-env-lookup env sym))
3660                   (and fnsym (scheme-env-lookup env fnsym)))))
3661    (and (consp spec)
3662         (consp (cdr spec))
3663         (let ((type (cadr spec)))
3664           (concat
3665            (cond
3666             ((nth 3 spec)
3667              "")
3668             ((and (consp type)
3669                   (memq (car type) '(syntax lambda)))
3670              (concat
3671               (if (eq (car type) 'syntax)
3672                   "syntax: "
3673                 "")
3674               (sexp-to-string
3675                (cons (car spec)
3676                      (scheme-optional-in-brackets
3677                       (mapcar #'scheme-base-type (cadr type)))))
3678               (if (and (consp (cddr type))
3679                        (not (memq (caddr type) '(obj object))))
3680                   (concat " => " (sexp-to-string (caddr type)))
3681                 "")))
3682             ((and (consp type) (eq (car type) 'special))
3683              (sexp-to-string (car spec)))
3684             (t
3685              (sexp-to-string type)))
3686            (if (and (not (nth 3 spec)) (nth 4 spec)) " - " "")
3687            (or (nth 4 spec) ""))))))
3688
3689(provide 'scheme-complete)
Note: See TracBrowser for help on using the repository browser.