R6RS:翻訳:Standard Libraries:12.7 Generating lists of temporaries

R6RS:翻訳:Standard Libraries:12.7 Generating lists of temporaries

12.7 時識別子リストの生成

変換子中で固定個数の識別子を挿入するには、単純にそれぞれの識別子に名前をつければよい。 しかし、場合によっては挿入される識別子の個数が入力式の特徴によって決定されることもある。 たとえば、単純に letrec を定義した場合、入力中の束縛ペアと同じ個数だけ一時識別子が必要になる。 手続き generate-temporaries は一時識別子のリストを作成するのに使う。

[procedure] (generate-temporaries l)

l は任意のリストないしはリスト構造を表現する構文オブジェクトである。 その内容は重要ではない。 生成される一時識別子の個数は l の要素数と同じである。一時識別子はおのおの一意である、つまりほかのすべての識別子とは異なることが保証されている。

本報告書の付録「派生式形の定義例」にある syntax-rules を使った定義と同等の、generate-temporaries をつかった letrec の定義は次のようになる。

(define-syntax letrec
  (lambda (x)
    (syntax-case x ()
      ((_ ((i e) ...) b1 b2 ...)
       (with-syntax
           (((t ...) (generate-temporaries #’(i ...))))
         #’(let ((i <undefined>) ...)
             (let ((t e) ...)
               (set! i t) ...
               (let () b1 b2 ...))))))))

こちらの場合では、必要な一時変数を生成するために再帰的に定義された補助構文を使う代わりに generate-temporaries を使っている。


Last modified : 2008/03/03 21:16:39 UTC