Clojureマクロは書きやすいが、ラケットの衛生的なマクロほど信頼性が低いと聞いたことがあります。私の質問には2つの部分があります。
gensym
は衛生的なマクロとどのように異なりますか?衛生的なマクロの利点は、言語機能の1つではありません。gensym
を使用し、適切なタイミングで慎重に引用/引用解除することで、衛生状態の良いマクロを作成できます。ただし、衛生的なマクロを確保マクロの衛生状態は良好です。その点では、型チェックのようなものです。
衛生的なマクロにはツールの利点もあります。ほとんどの衛生的なマクロシステムでは、マクロの動作とその実行方法を厳密に制御しています(たとえば、Schemeのsyntax-case
で定義されたマクロが展開されていると、任意のコードを実行できません)。これにより、マクロを「理解する」プログラムを簡単に作成でき、追加のツールサポートを提供できます。
一方、非衛生的なマクロが役立つ場合もあります。たとえば、実際にwantを使用して特定の変数のバインディングをキャプチャする場合(例: anaphoric macros )、あなたは衛生的なマクロしかなければ、運が悪い。