R6RS:翻訳:R6RS:1.9 Derived forms and macros

R6RS:翻訳:R6RS:1.9 Derived forms and macros

1.9 派生形式とマクロ

本報告書で規定されている特殊形式の多くはより基本的な特殊形式に変換することができる。例えば let 式は手続き呼び出しと lambda 式に変換することができる。次のふたつの式は等価である。

(let ((x 23)
      (y 42))
  (+ x y))         ⇒ 65

((lambda (x y) (+ x y)) 23 42) 
                ⇒ 65

let 式のような特殊形式は、その意味論が他の種類のフォームから導出できることから、派生形式と呼ばれる。次のふたつの定義は等価である。

(define (f x)
  (+ x 42))

(define f
  (lambda (x)
    (+ x 42)))

Scheme ではプログラム中で構文キーワードをマクロに束縛することで、独自の派生形式を作成することができる。

(define-syntax def
  (syntax-rules ()
    ((def f (p ...) body)
     (define (f p ...)
       body))))

(def f (x)
  (+ x 42))

define-syntax 構文は、パターン (def f (p ...) body) に合致する括弧でくくられた構造が (define (f p ...) body) に変換されることを指定している。ここで、 f、 p、 body はパターン変数である。したがって、上の例に現れた def フォームは次のように変換される。

(define (f x)
  (+ x 42))

構文キーワードを新たに作成できる能力により Scheme は極めて柔軟に表現力のあるものになってい、他の言語に組み込まれている機能の多くを Scheme では派生形式にすることができている。


Last modified : 2008/11/07 22:33:41 UTC