web-dev-qa-db-ja.com

LISPマクロの一般的なアプリケーションは何ですか?

私はいくつかのLISPを学ぼうとしていますが、LISPマクロの重要性についてたくさん読んだので、LISPマクロの実務経験をいくつか取得したいと思います。

マクロを使用して実際の問題を解決し、このプログラミング構造の有用性を理解できるようにする実用的なアプリケーション領域を提案できますか?

[〜#〜]ノート[〜#〜]

これは一般的なものではありません次に何をすべきか質問。 LISPマクロを使用して通常解決される問題の種類を理解することに興味があります。たとえば、抽象データ型の実装に適していますか?なぜこの構造が言語に追加されたのですか?簡単な機能では解決できない、どんな問題を解決しますか?

19
Giorgio

LISPマクロは、いくつかの異なるプロパティを組み合わせています。

  1. マクロは新しい構文を定義します。入力としてソースコードを使用します
  2. マクロは通常、コンパイル時に実行されます
  3. マクロはソースコードを生成します

最高のアプリケーションは、これらすべての側面を利用しています。おそらく最もよく知られている例は、Common LISPの(loop…)でしょう。これらの機能の1つがなければ、その有用性に近いものはありません。ソースを入力として使用しないと、ループ内のアクションを定義するのが難しくなります。コンパイル時の拡張なしでは、非常に遅くなります。コードを生成しないと、実行できません。

別のすばらしい例は、Practical Common LISPPractical:Parsing Binary Files のバイナリシリアル化の章です。

LINQと同様のものを実装するクエリマクロは、別の優れたアプリケーションである可能性があります。しかし、LINQをそのままの状態にするオートコンプリートが欠落しています。 XML入力(XAMLなど)を備えた特別な目的のコードジェネレーターによって現在解決されているほとんどすべてのものは、LISPマクロを使用して実装することもできます。

9
Patrick

一般的なLISPのマクロについて考えるのが好きな方法は、マクロは評価されるコードを返す関数ですが、そのコードを返す前に引数を「評価しない」ということです。関数も何かを返しますが、本体が評価される前に各引数を評価します。マクロにはありません。

'On LISP'のPaul Grahamは(IMHO)マクロと関数の違いの最良の説明の1つを提供し、それらの重複と一意性について説明しています。多くのコードは関数またはマクロとして記述できますが、マクロのみが機能する場合もあります。あなたがこれに頭を包んだら、LISPにはマクロの要点があると思います。

関数が機能しないマクロの例として、「aif」(照応if)を確認してください。それはほんの数行のコードであり、どこから始めるべきかについての私の推奨事項です。

また、意図的な変数の取得を利用する場合は、Common LISPのバージョンの照応を参照してください。 Schemeの自動衛生バージョンはIMOの「本当の取引」ではありません。変数のキャプチャはLISPマクロの重要な部分であり、より強力で有用なマクロのいくつかは確実にそれを利用します。

2
Clayton Stanley