アナフォリックマクロは、マクロに与えられた何らかの形式を意図的に捕捉するプログラミングマクロの一種であり、その形式はアナフォラ(別の表現を参照する表現)によって参照される可能性があります。アナフォリックマクロは、ポール・グラハムの著書『 On Lisp』 [1]で初めて登場し、その名称は言語学におけるアナフォラ[1]、つまり先行する単語の代わりに単語を用いることに由来しています。
例
ANSI Common Lisploopのマクロは、式が節内のテスト式の結果を参照するアナフォリックバインディングを採用しています。 [2] [3]it
nil以下は 以外の要素の値を合計する例です。 はitと等しくない要素の値を指しますnil。
( loop for element in ' ( nil 1 nil 2 nil nil 3 4 6 ) when element sum it ) ;; ⇒ 16
ここでは、真のときitの出力にバインドされ(and (> number 3) number)、3より大きい数値を集めています。[4]
( 1から6までの数字をループし、 (かつ( >数字3 )数字)がそれを収集します) ; IT は ( かつ ( > 数字 3 ) 数字 を参照します。;; ⇒ (4 5 6)
アナフォリックマクロの定義
一例としては、 if-then-else構文のアナフォリックバージョンがあり、これはテスト節の結果に結びついたアナフォを導入する: [5]it
( defmacro aif ( test-form then-form &optional else-form ) ` ( let (( it , test-form )) ( if it , then-form , else-form )))
( aif ( + 2 7 ) ( format nil "~A は NIL と等しくありません。" it ) ( format nil "~A は NIL と等しくなります。" it )) ;; ⇒ "9 は NIL と等しくありません。"
もう一つの例は、 λ関数のアナフォリック版であり、関数自体をアナフォラに結び付けて 再帰的selfに使用できるようにしている。[5]
( defmacro alambda ( parms &body body ) ` ( labels (( self , parms ,@ body )) #' self ))
;; 階乗関数は再帰的に定義されます。ここで `self' は alambda 関数
( alambda ( n ) ( if ( = n 0 ) 1 ( * n ( self ( 1- n )))))を参照します。
参照
参考文献
- ^ ab レット・オーバー・ラムダ第6章
- ^ 22. 実践的 Common Lispの黒帯向け LOOP
- ^ Lispにおけるアナフォリック条件文の例にはどのようなものがあるでしょうか?(StackOverflowより)
- ^ 6.1.8.1 Common Lisp HyperSpecからの節のグループ化の例
- ^ ab 第14章 アナフォリックマクロ 2012年4月26日アーカイブ、Paul Graham著On LispのWayback Machineにて
外部リンク
- 第14章 アナフォリックマクロ(ポール・グラハム著『 On Lisp』より)
- Anaphora — アナフォリックマクロコレクション