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