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