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