SynaxRules
Schemeのsyntax-rulesの使い方をまとめたい。
http://www.unixuser.org/~euske/doc/r5rs-ja/
以下の記述にはN個(Nは十分に大きい数)の間違いが含まれている可能性があります。
define-macroとdefine-syntax
Gaucheではマクロを定義するのに、Lisp由来のdefine-macroと Scheme由来のdefine-syntax の両方が利用可能になっている。
define-macroは単純に渡されたリストを変形して新しいリスト(プログラム)を 返すもので、hygenicではない。
define-syntaxはR5RSで定義されているもので、独自のパターン言語を使って マクロを定義する。
syntax-rules
syntax-rulesという関数を使うと、パターン言語を使った構文が作れる。 普通は、これをdefine-syntaxに渡して構文を定義したり、let-syntax/leterc-syntaxに渡して 一定範囲内だけで使える構文を定義したりする。
例1: when
(define-syntax when
(syntax-rules()
((when test stmt1 stmt2 ...)
(if test
(begin stmt1
stmt2 ...)))))
例2: my-or
(define-syntax my-or
(syntax-rules()
((my-or) #f)
((my-or e) e)
((my-or e1 e2 ...)
(let ((temp e1))
(if temp
temp
(my-or e2 ...))))))
View on github | Report issue