web-dev-qa-db-ja.com

Clojureに衛生的なマクロがないことから生じる実際的な問題は何ですか?

Clojureマクロは書きやすいが、ラケットの衛生的なマクロほど信頼性が低いと聞いたことがあります。私の質問には2つの部分があります。

  1. gensymは衛生的なマクロとどのように異なりますか?
  2. Clojureにはない、ラケットマクロは何を提供しますか? (それは安全性、構成可能性、または何でも)
11
Alex

衛生的なマクロの利点は、言語機能の1つではありません。gensymを使用し、適切なタイミングで慎重に引用/引用解除することで、衛生状態の良いマクロを作成できます。ただし、衛生的なマクロを確保マクロの衛生状態は良好です。その点では、型チェックのようなものです。

衛生的なマクロにはツールの利点もあります。ほとんどの衛生的なマクロシステムでは、マクロの動作とその実行方法を厳密に制御しています(たとえば、Schemeのsyntax-caseで定義されたマクロが展開されていると、任意のコードを実行できません)。これにより、マクロを「理解する」プログラムを簡単に作成でき、追加のツールサポートを提供できます。

一方、非衛生的なマクロが役立つ場合もあります。たとえば、実際にwantを使用して特定の変数のバインディングをキャプチャする場合(例: anaphoric macros )、あなたは衛生的なマクロしかなければ、運が悪い。

6
Nathan Davis