1;;;
2;;; SRFI-55   require-extension
3;;;
4;;; Written by Shiro Kawai
5;;;
6
7;; This file is to be autoloaded
8
9(define-module srfi-55
10  (export require-extension))
11(select-module srfi-55)
12
13;; We expand require-extension into cond-expand, which will
14;; load and imports required features if necessary.
15;; (This depends on the fact that Gauche's cond-expand has an effect
16;; after the form).
17;;
18;; An important extension from the plain cond-expand is that
19;; if we can't cond-expand to srfi-N, we look for the module
20;; srfi-N from the current load path.
21
22(define-macro (require-extension . clauses)
23  (define (rec clauses)
24    (cond ((null? clauses) #t)
25          ((pair? (car clauses))
26           (if (eq? (unwrap-syntax (caar clauses)) 'srfi)
27             (require-srfi (cdar clauses) (cdr clauses))
28             (error "require-extension: unknown extension identifier:"
29                    (car clauses))))
30          (else
31           (error "require-extension: bad clause:" (car clauses)))))
32  (define (require-srfi ids rest)
33    (if (null? ids)
34      (rec rest)
35      (let ((id (string->symbol #"srfi-~(car ids)")))
36        `(cond-expand (,id ,(require-srfi (cdr ids) rest))
37                      (else
38                       (use ,id) ;; count on the user providing srfi-N.scm
39                       ,(require-srfi (cdr ids) rest))))))
40  (rec clauses))
41
42
43
44
45
46
47