私は最近 Clojure をよく使っていますが、一般的な Lisp リーダー マクロが提供しない機能をまだ理解していません。これを簡単な言葉で説明できますか?
3 に答える
つまり、リーダー マクロを使用すると、区切りコンテキスト内でプログラミング言語の構文を再定義できます。
たとえば、#"pattern"
リーダー マクロを指定して、正規表現リテラル (例: ) を自分で実装できます。それらがないと、 に渡される文字列リテラルで正規表現を適切にエスケープする必要がありますre-pattern
。
ところで、リーダーを変更するためのパブリック Clojure API はありませんが、次の投稿に示されているように、不可能ではありません。
簡単な例。Common Lisp では、[] の代わりに #() ベクトルの異なるリーダー構文があります。しかし、カスタム リーダー マクロを作成する機能を使用すると、[2 3 4 5] を Common Lisp のベクトルに変換するリーダー マクロを作成することもできます。
ほとんどのユーザーは自分が作成したリーダー マクロの意味を認識していないため、ほとんど使用されず、混乱を完全に回避するために、Rich Hickey は Clojure でユーザー定義のリーダー マクロを使用する機能を削除することにしました。ただし、Clojure には事前定義されたリーダー マクロがあります - quote、vector、regex、map など
Common Lisp では、リーダーはリーダー マクロを使用してユーザーが拡張できます。読者はs-expressionsを読む責任があります。S 式は、数値、文字列、記号、リスト、cons、構造体、配列、文字などの Lisp のデータ型の外部テキスト構文です。
読者は、プログラミング言語 Lispの構文については責任を負いません。s式についてだけです。
したがって、ユーザーの観点から見ると、リーダー マクロの主な目的は、s 式の構文を拡張または変更することです。たとえば、ユーザーは、さまざまな CLOS クラス (URL など)、ハッシュ テーブル、特別な識別子、新しい数値型などのテキスト構文を追加できます。
トークンを形成するルールが異なる他の言語/構文の埋め込みにも使用されることがあります: 埋め込み SQL、埋め込み C、中置式、Objective C への埋め込み呼び出し、埋め込みルール言語、埋め込み XML、埋め込み JSON など。
もう 1 つの用途は、ユーザーが s 式をさらに制御できるようにすることです。リーダーは実際に読み取ります。たとえば、条件付き特徴表現。
このように、ユーザーがプログラム可能なリーダー マクロにより、ユーザーは上記の機能に関してリーダーをカスタマイズできます。これは、データ構文/トークン レベルで言語をカスタマイズしたいユーザーにとって便利であると想像できますが、別の複雑なレイヤーが追加されます。