8

Julia マクロが使用されているのを見るたびに、@assertまたは@time@ 接頭辞を使用してマクロを構文的に区別する必要性について常に疑問に思っています。マクロに @ を使用する場合、どのようなことに注意すればよいですか? 私にとっては、そうでなければ非常に優れた言語 (構文的に言えば) にノイズと気晴らしが追加されます。

つまり、私にとって「@」には参照の意味があります。つまり、ドメインやアドレスのような場所です。場所の意味では、@ は、別のコンパイル手順であること以外のマクロには意味がありません。

4

3 に答える 3

18

これ@は、言語の通常のルールが適用されない可能性があることを示す警告サインと見なす必要があります。たとえば、関数呼び出し

f(x)

呼び出しコンテキストで変数の値を変更することはありませんxが、マクロ呼び出し

@mymacro x

(または@mymacro f(x)そのことについて)非常にうまくいくかもしれません。

もう 1 つの理由は、Julia のマクロが C のようなテキスト置換に基づいているのではなく、抽象構文ツリーでの置換に基づいていることです (これははるかに強力であり、テキスト置換マクロが悪名高い予期しない結果を回避します)。

Julia ではマクロには特別な構文があり、解析後に展開されるため、パーサーは (現在のスコープでどのマクロが定義されているかを知らなくても) それらを認識するための明確な方法も必要とします。

ASCII 文字は、Julia を含め、ほとんどのプログラミング言語の設計において貴重なリソースです。を選択したのは@、もっと重要なことには必要がなく、かなり目立つという事実に帰着すると思います。

于 2015-03-21T12:56:00.440 に答える
4

シンボルは常に、使用されるコンテキスト内で解釈される必要があります。文脈を超えてシンボルに複数の意味を持つことは新しいことではなく、おそらくなくなることはありません。たとえば#include、C プログラムが Twitter でバイラルになるとは誰も期待すべきではありません。

Julia のドキュメンテーションエントリちょっと待って: なぜマクロなの? では、マクロを作成および/または使用する際に留意すべきいくつかの事項について、かなり詳しく説明しています。

いくつかのスニペットを次に示します。

マクロはコードが解析されるときに実行されるため必要です。したがって、マクロを使用すると、プログラマーは完全なプログラムを実行する前に、カスタマイズされたコードのフラグメントを生成して含めることができます。

...

マクロが引数を式、リテラル、またはシンボルとして受け取ることを強調することが重要です。

したがって、式を指定してマクロを呼び出すと、結果だけでなく、式全体が取得されます。

...

記述された構文の代わりに、マクロ呼び出しは解析時に返された結果に展開されます。

于 2015-03-21T12:53:39.057 に答える
2

@実際には、シンボル自体のセマンティクスに非常にうまく適合します。

ウィキペディアの「アット シンボル」の項目を調べてみると、前置詞「アット」の代わりとしてよく使われていることがわかります (そうです、「アット」と読みます)。また、前置詞「at」は、空間的または時間的な関係を表現するために使用されます。

そのため@、-symbol を前置詞 at の省略形として使用して、空間的な関係 (@tony's bar、@france などのような場所) をメモリの場所 @0x50FA2C (ポインタ/アドレスなど) に参照することができます。 、メッセージの受信者 (Twitter や他のフォーラムが使用する @user0851 など) に対してだけでなく、一時的な関係、つまり @05:00 am、@midnight、@compile_time、または@parse_timeに対しても使用されます。

また、マクロは解析時に処理されるため(ここにあります)、これは実行時に評価される他のコードとは完全に異なります (そうです、間には多くの異なるフェーズがありますが、それはここでのポイントではありません)。さらに、次のコード フラグメントが解析時に処理されることをプログラマーに明示的に注意してください。ランタイムとは対照的に、@ を使用します。

私にとって、この説明は言語にうまく適合します。

皆さんありがとう ;)

于 2015-03-21T21:09:47.523 に答える