1#lang scheme/base 2 3(provide feature-present? feature->require-clause) 4 5(define *feature-alist* 6 '()) 7 8(define (srfi-id? id) 9 (regexp-match? #rx"^srfi-[0-9]+$" (symbol->string id))) 10 11(define (srfi-id->filename srfi-id) 12 (regexp-replace #rx"^srfi-([0-9]+)$" (symbol->string srfi-id) "\\1/\\1.rkt")) 13 14(define (srfi-id-present? srfi-id) 15 (file-exists? (build-path (collection-path "srfi") 16 (srfi-id->filename srfi-id)))) 17 18(define (feature-present? id) 19 (or (and (srfi-id? id) (srfi-id-present? id)) 20 (and (assq id *feature-alist*) #t))) 21 22(define (feature->require-clause id) 23 (cond [(and (srfi-id? id) (srfi-id-present? id)) 24 (string->symbol (regexp-replace #rx"^srfi-([0-9]+)$" 25 (symbol->string id) 26 "srfi/\\1/\\1"))] 27 [(assq id *feature-alist*) => cdr] 28 [else (error 'feature->require-clause "unknown feature: ~e" id)])) 29