Lispマクロの典型的な用途は何ですか?


19

私はいくつかのLISPを学ぼうとしていますが、LISPマクロの重要性について多くのことを読みましたので、それらを使った実務経験を得たいと思います。

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

注意

これは一般的なプロジェクトではなく、次の質問を行うべきプロジェクトです。LISPマクロを使用して通常どのような問題が解決されるかを理解したいと思っています。たとえば、抽象データ型の実装に適していますか?なぜこのコンストラクトが言語に追加されたのですか?単純な機能では解決できない、どのような問題を解決しますか?


回答:


9

Lispマクロはいくつかの明確なプロパティを組み合わせます:

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

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

別の細かな例は、内のバイナリシリアル化の章で実用的なCommon Lisp解析バイナリファイル:実践

LINQに似たものを実装するクエリマクロは、別の優れたアプリケーションかもしれません。しかし、LINQをそのまま優れたものにする自動補完が欠落しているでしょう。現在、XML入力(XAMLなど)を備えた特別な目的のコードジェネレーターによって解決されるものは、Lispマクロを使用して実装することもできます。


「Practical Common Lisp」という本を購入しました。あなたが提案した例を見てみましょう。
ジョルジオ

2

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.