クォートと準クォート、マクロ

「プログラミングGauche」を読んでます。

リストへのクォート

リストはクォートされていれば「リストデータ」、クォートされていなければ「プログラム」として解釈される。

gosh> (+ 1 2 (+ 1 2))
6
gosh> '(+ 1 2 (+ 1 2))
(+ 1 2 (+ 1 2))

リストをクォートすれば、リスト全体がクォートされる。

準クォート

リストの一部は評価した値でデータを構築したい場合、準クォートを使用する。
'の代わりに`を指定し、評価したい式の前にはカンマをつける。

gosh> `(+ 1 2 ,(+ 1 2))
(+ 1 2 3)

マクロ

「プログラムを引数に取り、プログラムを返す手続き」。
プログラムを構築し、その結果をリストとして返す。マクロ構築の際、準クォート使う例がよくある。

gosh> (define-macro (aif test then . else)
        `(let ((it ,test))
           (if it ,then . ,else)))
#<undef>

gosh> (aif (member 1 '(1 2 3)) (car it))
1
gosh> (aif (member 5 '(1 2 3)) (car it))
#<undef>