クォートと準クォート、マクロ
「プログラミング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>