source: project/chicken/branches/scrutiny/scheme-complete.el @ 14827

Last change on this file since 14827 was 14827, checked in by felix winkelmann, 10 years ago

merged trunk changes until 14826 into scrutiny branch

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