R5RS ライブラリを R6RS ライブラリに加工する


Tags: ライブラリ, マクロ, R6RS

R5RS ライブラリを R6RS ライブラリとして利用する場合、多くは、もとのソースコードに対して

(library (htmlprag)
  (export ...)
  (import (rnrs) ...)

  ;; copy the original source code here
  ...
  )

のように適切な library / import / export を指定してやればよい。

何らかの理由でもとのソースコードには手をつけず外部の別ファイルとして置いておきたい場合には

(library (util include)
  (export include)
  (import (rnrs))

  (define-syntax include
    (lambda (x)
      (define (%include ctxt filename)
        (call-with-input-file filename
          (lambda (p)
            (let loop ((exp (read p))
                       (rs '()))
              (if (eof-object? exp)
                  (reverse rs)
                  (loop (read p) (cons (datum->syntax ctxt exp) rs)))))))
      (syntax-case x ()
        ((ctxt filename)
         #`(begin #,@(%include #'ctxt (syntax->datum #'filename)))))))
  )

のようなライブラリを用意しておき、

(library (htmlprag)
  (export ...)
  (import (rnrs) (util include) ...)

  (include "/path/to/original/htmlprag")
  )

のようにするとよい。