彼の著書ANSICommon Lisp、p.320で、Paul Grahamは次のように書いていますmacrolet
。「同様flet
に、ローカルマクロは互いに呼び出すことはできません。」
多分私はこれを誤解しているかもしれませんが、私はそれが真実である可能性がある方法を考えることができません。マクロは相互に拡張するほど相互に呼び出しを行うことはなく、マクロ拡張の性質上、スコープで定義されているすべてのマクロが拡張されるまで継続します。
次のようなコードは、私が試したCommonLispのすべての実装においてGrahamと一致しません。
(macrolet ((jump (x) `(car ,x))
(skip (x) `(jump ,x))
(hop (x) `(skip ,x)))
(hop '(1 2 3)))
=> 1
(macrolet ((yin (n x)
(if (zerop n)
`(cdr ,x)
`(yang ,(1- n) ,x)))
(yang (n x)
(if (zerop n)
`(car ,x)
`(yin ,(1- n) ,x))))
(yin 6 '(1 2 3)))
=> (2 3)
グラハムの発言は誤りですか?
によって定義されたマクロが、同じで定義された別のマクロの使用macrolet
に拡張されても問題ありませんmacrolet
。で定義されたマクロmacrolet
が、同じで定義された別のマクロを直接使用することは正しくありませんmacrolet
。例えば:
(macrolet ((jump (x) `(car ,x))
;; Okay since skip expands into jump.
(skip (x) `(jump ,x)))
(skip '(1 2 3)))
=> 1
とは対照的に
(macrolet ((jump (x) `(car ,x))
;; Wrong since skip uses jump directly.
(skip (x) (jump x)))
(skip '(1 2 3)))
=> Error: The function COMMON-LISP-USER::JUMP is undefined.
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加