2011-04-21 11 views

答えて

10

要するに、リーダマクロは、区切り文脈内でプログラミング言語の構文を再定義する機能を提供します。

たとえば、リーダマクロを指定した正規表現リテラル(例:#"pattern")を実装できます。それらがなければ、re-patternに渡された文字列リテラルで正規表現を正しくエスケープする必要があります。ところで

、何の公共ClojureのAPIは、読者を修正するために存在しない間、これらの投稿に示すように、それは、不可能ではないです:Common Lispでは

8

単純な例です。 Common Lispは、[]の代わりにベクトル#()のリーダー構文が異なります。しかし、カスタムリーダマクロを作成することができれば、Common Lispのベクトルに[2 3 4 5]を渡すリーダマクロを持つことができます。

ほとんどのユーザーは作成したリーダマクロの意味を理解していないため、ほとんど使用されず、混乱を避けるためにRich HickeyはClojureでユーザー定義のリーダマクロを持つ機能を削除することにしました。しかし、Clojureには、あらかじめ定義されたリーダマクロ(引用、ベクトル、正規表現、マップなど)があります。

6

リーダーは、リーダーマクロでユーザー拡張が可能です。 リーダーのS式を読み込む責任があります。 S式数値、文字列、シンボル、リスト、コンス、構造体、配列、文​​字、などのLispのデータ型の外部テキストの構文です ...

読者はの構文については責任を負いませんプログラミング言語Lisp - ちょうどのS式

このように、読者マクロの主な目的は、s式の構文を拡張または変更することです。たとえば、ユーザーは、さまざまなCLOSクラス(URLなど)、ハッシュテーブル、特殊な識別子、新しい数値型などのテキスト構文を追加できます。

時には他の言語の構文を埋め込むためにも使用されます埋め込みSQL、埋め込みC、埋め込み式、Objective Cへの埋め込み呼び出し、埋め込みルール言語、組み込みXML、埋め込みJSONなどのトークンを作成するためのさまざまなルールを持つ、

もう1つの使用法は、ユーザーがs式をさらに制御できるようにすることです。リーダーが実際に読み取ります。例えば、条件付き特徴表現。

したがって、ユーザがプログラム可能なリーダマクロによって、ユーザは、上記の機能に関してリーダをカスタマイズすることができる。これは、データ構文/トークンレベルで言語をカスタマイズしたいというユーザにとっては便利だが、複雑さの面で別の層が追加されていると考えられる。

関連する問題