2017-09-02 19 views
2

完全なマクロ展開を取得する方法がわかりません。このコードではClojureでマクロ展開がネストされたフォームを展開しないのはなぜですか?

(when true (when true true)) 

は、私は完全なマクロ展開

(if true (do (if true (do true))) 

を取得したいと思います。しかし、私は

が、私は拡張の最初のレベルを解決しますmacroexpansion-1を理解することはできません。

(macroexpand-1 '(when true (when true true))) 

(if true (do (when true true))) 

しかし、なぜ私は(それがmacroexpandを何をすべきかだ)macroexpand-1再び呼び出すとき:

(macroexpand-1 '(if true (do (when true true)))) 

私は正確に同じ結果を得ましたか。

(if true (do (when true true))) 

私は完全なマクロ展開を期待していました。

マクロ展開は最上位フォームでのみ機能しますか?

私はclojure.walk名前空間のexpand-all機能の承知しているので、私はmacroexpandは、ネストされた構造では動作しませんと仮定し 。私は正しい?

答えて

6

あなたは正しいです。

を参照してください、それは述べてもhttps://clojuredocs.org/clojure.core/macroexpand

:1-macroexpandはもmacroexpandはサブフォーム内のマクロを展開するでもない

注意を。

そして実際macroexpandは、すべての再帰的な展開を行います。

> (clojure.walk/macroexpand-all '(when true (when true true))) 
(if true (do (if true (do true)))) 

も参照してくださいhttps://clojuredocs.org/clojure.walk/macroexpand-all

それは述べ場所:

を再帰的にフォーム内のすべての可能なマクロ展開を行います。

あなたの例

(macroexpand-1 '(if true (do (when true true)))) 

あなたを混乱させるが、ドキュメントが言うように、それはないかもしれません:

(macroexpandは-1形式)フォームがマクロのフォームを表す場合、その 拡大を返します。それ以外の場合はフォームを返します。

したがって、 'if'はマクロではないので、サブフォームには行かない場合にだけ戻ります。

関連する問題