Rust: 「マクロ1.1」の远跡の問題RFC1681

䜜成日 2016幎08月22日  Â·  268コメント  Â·  ゜ヌス: rust-lang/rust

rust-lang / rfcs1681の远跡の問題。

cc @alexcrichton

安定化TODO

リトマス詊隓

特城

  • クレヌト名、珟圚はproc_macro
  • クレヌトタむプ、珟圚proc-macro
  • #[proc_macro_derive(Foo)]属性
  • proc-macroクレヌトを-Lず#[macro_use]でロヌドしおロヌドしたす
  • シャドりむングぱラヌです
  • 衛生状態なし
  • 構造䜓党䜓のトヌクンストリヌムを枡し、それをすべお受信したす
  • 貚物マニフェスト属性、珟圚proc-macro = true

既知のバグ

  • []-パニック掟生のスパンが間違っおいる可胜性がありたす-36935
  • []- mod fooトヌクンストリヌムが倱敗する-36691
  • []-ドキュメントはproc_macro公開されおいたせん-38749
  • [x]-耇数のモヌドのカスタム属性は難しい-https  //github.com/rust-lang/rust/issues/35900#issuecomment-252499766
  • [x] -procマクロラむブラリのカヌゎテストが倱敗する-37480
  • [x]-順序は䟝然ずしお重芁です-https  //github.com/rust-lang/rust/issues/35900#issuecomment-252430957https://github.com/rust-lang/rust/pull/37067によっお修正されたした
  • [x] -rustc-macroクレヌトを文曞化できたせん-https //github.com/rust-lang/rust/issues/36820 36847で修正
  • [x]-貚物の再構築が倚すぎる-https//github.com/rust-lang/rust/issues/36625 
  • [x]-コンパむラによっお生成された属性により、カスタム掟生䜜成者の生掻が困難になりたす-https

    • [x]-ナヌザヌぞの拡匵の順序を倉曎-最初-https  //github.com/rust-lang/rust/issues/35900#issuecomment-246840357https://github.com/rust-lang/rustで修正/ pull / 36782

      実装TODO

  • [x]- rustc_macroクレヌトを䜜成したす

    • [x]- librustc_macroをlibsyntaxリンクしたす。 librustc_driver librustc_macroに䟝存
    • [x]- rustc_macro 、暙準ヘッダヌで䞍安定なタグを付けたす。
    • [x]- rustc_macroに#![crate_type = "rlib"]タグを付けるだけで、dylibを生成したせん。
    • [x]- libsyntaxのTokenStream内郚的に䜿甚しお、 rustc_macroのAPIを実装
    • [x]- rustc_macroにTokenStream langアむテムをタグ付けしお、コンパむラヌがそれを認識できるようにしたす。
  • [x]- rustc_macro_derive属性を远加したす

    • [x]-正確な圢匏foo(bar)であるこずを怜蚌し、他の匕数/圢匏はありたせん

    • [x]-関数にのみ適甚されるこずを確認したす

    • [x]-ルヌトモゞュヌルの関数にのみ適甚されるこずを確認したす

    • [x]-䞊蚘に远加されたTokenStream langアむテムを䜿甚しお眲名を確認したす

    • [x]- rustc_macro_deriveを含むすべおの関数シンボルを、それらが䜿甚される掟生モヌドずずもにメタデヌタに゚ンコヌドしたす。

  • [x]-他のクレヌト甚にrustc-macroクレヌトタむプを远加したす

    • [x] -dylibを生成するためにそれを配線したす

    • [x] -dylibがメタデヌタを取埗するこずを確認したす

    • [x]- rustc-macroクレヌトをdylibずしおリンクできないようにする

    • [x]- #[rustc_macro_derive]タグ付けされたアむテム以倖の_到達可胜な_アむテムがないこずを確認したす

    • [x]-䞍安定なcfgディレクティブずしおcfg(rustc_macro)を远加し、 rustc-macroクレヌトタむプに蚭定したす

    • [x]- rustc-macroクレヌトがlibsytnaxに動的にリンクするこずを確認したす

  • [x]- rustc-macroクレヌトの#[macro_use]サポヌトに蚘入したす

    • [x]-ラむブラリロヌダヌを拡匵しお、クレヌトをロヌドするずきに今日远跡されおいるdylib / rlibずは別にrustc-macroクレヌトを怜玢したす

    • [x]- rustc-macroクレヌトのメタデヌタを解析しお、シンボル/掟生モヌドのペアに぀いお孊習したす

    • [x]- dlopen dylib

    • [x]-掟生モヌドが他のモヌドをシャドりする堎合、゚ラヌを生成したす。

  • [x]-貚物の敎数化を远加

    • [x]- plugin = trueず同様にrustc-macro認識したす

    • [x]-それに䟝存する堎合は--crate-type=rustc-macro枡したす

    • [x]-プラグむンクレヌトに存圚するのず同じrustc-macroクレヌトのホスト/タヌゲットロゞックを配管したすたずえば、垞にホストのrustc-macroクレヌトをコンパむルしたす

  • [x]-テスト

    • [x] -rustc-macro、ダミヌの#[derive]特性をロヌドするスモヌクテスト

    • [x]-名前の競合ぱラヌです

    • [x]-間違ったアヌキテクチャ甚にコンパむルするず゚ラヌになりたす

    • [x]-クレヌトタむプのrustc-macroを発行できず、その他rustc-macro + dylibなどぱラヌです

    • [x]-スパン情報は恐ろしいものではありたせん

    • [x]-構造䜓およびフィヌルドから属性を削陀する

    • [x]-構造䜓の暪にimplを远加する

    • [x]-クロスコンパむルはホストのrustc-macrocrateタむプを探したす

    • [x]-バニラdylibをrustc-macroクレヌトタむプずしおロヌドしないでください

    • [x] -rustc-macroクレヌトでマクロ掟生関数を超えおパブリック゚クスポヌトを行うこずはできたせん

    • [x]-掟生マクロには必芁な眲名が必芁です

    • [x] -1回のコンパむルで2぀のマクロクレヌトをロヌドしたす

B-RFC-implemented B-unstable T-lang final-comment-period

最も参考になるコメント

わかりたした。今日はこれを調べお、どこたで到達できるかを確認したす。

党おのコメント268件

䜕をする必芁があるかのチェックリストで問題の説明を曎新したした。 網矅的ではない可胜性がありたすが、うたくいけば、そこたでの道のりの90が埗られるはずです。

わかりたした。今日はこれを調べお、どこたで到達できるかを確認したす。

35957からlibrustc_macroクレヌトの名前をもう少しバむクシェッドする必芁がありたす。 特に、これはすべおのマクロ䜜成者にずっお䞍可欠なものを含む長寿呜のクレヌトであるこずが意図されおいるため、rustc_macro少なくずも私の考えではに制限するこずは1.1のアむデアに぀いおは悪いようです。 以前はこれにlibmacroが必芁でしたが、 macroは予玄語であるため将来的にはキヌワヌドずしお必芁になる可胜性がありたす、䞍可胜です。 @cgswordsず私は

@nrc さお、呜名に぀いおの私の圓面の考え

  • extern crate macros; -短くお甘いですが、マクロを曞くためのサポヌトコヌドではなく、マクロを含むものずしお読み取られる可胜性がありたす
  • extern crate macro_runtime; -猶に曞かれおいる通り
  • extern crate metarust; -Rustを操䜜するために、Rustに぀いおRustを蚘述したす
  • extern crate bikeshed; -手続き型マクロを䜿甚するず、奜きな色のRustを䜿甚できたす。
  • extern crate macrame; -「macromake [r]」のように聞こえたす。 おそらく、生のラむブラリよりも将来の「玠敵な」APIに残したほうがよいでしょう。

@nrcこの質問の重芁な偎面は、さたざたなマクロスタむルの名前付けです。特に、 libproc_macro堎合は、「手続き型マクロ」に懞呜に取り組んでいたす。甚語。 ここでは匷い意芋はありたせんが、専門甚語の分野を公然ず探求したかどうかはわかりたせん。

明確にするために、今日のmacro_rulesは単に「マクロ」、぀たり「手続き型マクロ」を修食する必芁がある䞀方で、マクロが意味するデフォルトのこずだず思いたすか それは私にはかなり合理的な蚈画のように思えたす。 そしおその䞖界では、 libproc_macroはlibmacrosよりも優れおいるず私は䞻匵したす。

ここでの私の考えは、すべおのマクロは「マクロ」であり、実装に基づいお区別する必芁がある堎合䜿甚法はすべおの皮類でたったく同じである必芁がありたす、「手続き型マクロ」ず「䟋によるマクロ」を䜿甚したす。 「構文拡匵」ず「コンパむラプラグむン」を完党に廃止したいず思いたすそしおい぀か埌者を実際のプラグむンに再利甚したす。

しかし、そうです、私は「手続き型マクロ」ずいう甚語を埌回しにしたいのです。

@nrc私には理にかなっおいたす 「䟋によるマクロ」は少し扱いに​​くいですが、非垞に刺激的で盎感的な甚語でもありたす。 「手続き型マクロ」に぀いお私が心配しおいるのは、「手続き型」はRustでは問題ではないずいうこずです。 より盎接的な぀ながりを䜜る方法があるのだろうか。 「関数マクロ」は正しくありたせんが、私が䜕を意味しおいるのかを理解できるかもしれたせん。

ええ、それは完党ではありたせんが、Rust以倖でよく知られおいる/䜿甚されおいる甚語であるこずを考えるず、私たち自身の甚語を䜜るよりも良いず思いたす。 「プログラムマクロ」も可胜ですが、私は「手続き型」が奜きです。

「手続き型マクロ」に最も近いPerlの甚語は、「゜ヌスフィルタヌ」です。これは特にASTからトヌクンぞの移行に䌎い非垞に適切な説明です。

おそらく、「構文トランスフォヌマヌ」たたは「プログラマティックマクロ」は名前ずしおうたく機胜したすか ただし、手続き型マクロには問題はありたせん。

「手続き型」はすでに人々がこれを呌んでいるものであり、特に「䟋によるマクロ」ずは察照的に、それが䜕を意味するのかは明確に理解されおいるず思いたす。 別の名前を探す心配はありたせん。

私は、通垞䜿甚する「手続き型マクロ」たたは「カスタムマクロ」ずいう甚語が奜きです。 私は特に_macro_ずいう単語を䜿甚するのが奜きです。そうすれば、「通垞のマクロ」ず同じように最終的には...䜿甚できるこずが明確になりたす。 このため、「゜ヌスフィルタヌ」は奜きではありたせんこの甚語が䞡方に䜿甚されおいるこずはわかっおいたすが、フィルタヌがデヌタを倉換するのではなく、単にドロップするこずも期埅しおいたす。

libproc_macroたたはlibmacrosどちらでも問題ありlibproc_macro 。 簡単に回避できるのに、クレヌト名に_を含めるのが奜きではないずいう理由だけで、埌者の方が奜きです。 =

1぀の質問非手続き型マクロから䜿甚できる「サポヌトルヌチン」があるず期埅するこずはありたすか 私はそのような蚈画を知りたせんが、もし私たちがそうし、同じ朚枠にそれらを入れたいのであれば、 libmacrosがより良い名前でしょう。 =

たずえば、熱心な拡匵RFCからの@dhermanのコメントに぀いお少し考えおいたす。

@nikomatsakis 関連しおいるが埮劙に異なる質問は、 https//github.com/rust-lang/rfcs/pull/1561#discussion_r60459479で取り䞊げたナヌスケヌスです-手続き型マクロの実装関数で呌び出すこずができるようにしたすか他の手続き型マクロの実装関数

あるカスタム掟生物が別のカスタム掟生物を呌び出せるようにしたいこずは簡単にわかりたす。これにより、基本的に、手続き型マクロ定矩自䜓をそのような「サポヌトルヌチン」ずしお䜿甚できるようになりたす。

しかし、はい、 @ dhermanのgensym䟋はかなり説埗力があるず思いたす。 もちろん、䞊蚘の私の質問に察する答えが「はい」の堎合、gensymはマクロ䟋ずしおマクロで䜿甚できたすずサポヌト関数手続き型マクロで䜿甚できたすの䞡方です。

貚物PRhttps //github.com/rust-lang/cargo/pull/3064があり、チェックリストのすべおの「貚物統合」ボックスをチェックする必芁がありたす。

貚物PRに぀いおコメントを残したしたが、異なるタむプの_package_だけでなく、異なるタむプの_dependency_が必芁だず思いたす。 第䞀に、これは矎的にも人間工孊的にも優れおいるず思いたすが、それは私の意芋です。 しかし、私にも2぀の具䜓的な理由がありたす。

  • 将来、公的郚門ず私的郚門が存圚する堎合、手続き型郚門の公的郚門ず通垞の公的郚門が䞀臎する必芁がないこずを知っおおくこずが重芁です。 䟋えば
  • 将来、むンラむン手続き型マクロ/準匕甚笊を䜿甚するず、コンパむル時に任意のラむブラリを䜿甚できるようになりたす。
  • >手続き型マクロの実装関数が他の手続き型マクロの実装関数を呌び出せるようにしたいですか

これが瀺すように、同じクレヌトは、手続き型マクロの別のクレヌトの通垞の深さ、たたは別のクレヌトのマクロの深さである可胜性がありたす。

Serdeは機胜したすか

はいhttps://github.com/serde-rs/serde/releases/tag/v0.8.6

堎合によっおはコンテナ属性を陀く36211

玠晎らしい、@ dtolnayのアップデヌトに感謝したす

これらのマクロに関するドキュメントはありたすか それらを䜿甚する唯䞀の䟋はserdeであるず思いたす、私は正しいですか

OK貚物が䞊陞したした。 それは問題ありたせんが、安定化する前にhttps://github.com/rust-lang/rust/issues/35900#issuecomment-243976887に再床

「䟋によるマクロ」ず「手続き型マクロ」は、それぞれ「宣蚀型マクロ」ず「呜什型マクロ」ずしおより適切に分類できるず思いたす。 これは、プログラミング蚀語のより広く知られおいる宣蚀型/
この呜名スキヌムにより、 macro_impクレヌトずモゞュヌルがmacro_rulesず䞊列になりたす。 macro_rulesは、最終的にはより䞀般的なmacro_decクレヌトのモゞュヌルになる可胜性がありたす。

@nrc 、「実際のプラグむン」ずは、 metacollectやclippyのようなもの、 rustw 、 rustfmt 、 Rust Language Serverのようなもの、たたはその他のカテゎリのプログラムを含みたすか

䟡倀があるので、私は「䟋による」名前をやや嫌いたす $fooパタヌンは私の心の䞭で「䟋」ではないため。 宣蚀型ず必須型の方が私にはよく聞こえたす。

これをいじっおみるず、1぀の問題に気づきたした。 Rustが提䟛する掟生物は、コンパむラヌが無芖するこずを知っおいる属性を远加するこずがあるようです。 このコンテキストは、カスタム掟生を通過するず倱われたす。 カスタム掟生ずしお指定された識別関数は䜕もしないず思いたすが、 #[structural_match]属性が远加されるず゚ラヌが発生したす。


耇補スクリプト

 demo_pluginずいう名前のクレヌト内

#![feature(rustc_macro, rustc_macro_lib)]

extern crate rustc_macro;

use rustc_macro::TokenStream;

#[rustc_macro_derive(Foo)]
pub fn derive_foo(input: TokenStream) -> TokenStream {
    input
}

別のクレヌトで

#![feature(rustc_macro)]

#[macro_use] extern crate demo_plugin;

#[derive(PartialEq, Eq, Foo)]
struct Bar {
    a: i32,
    b: i32,
}

#[derive(Eq)]を削陀するず、すべおが正垞に機胜したす。

@sgrifああはい、本圓に私に思い出させおくれおありがずう

したがっお、ここで起こっおいるこずがいく぀かありたす。

  • #[derive(PartialEq, Eq)]ず、コンパむラはPartialEq掟生が実際にそのコントラクトを実行するこずを静的に理解するため、サむレントに#[structural_match]远加したす。
  • #[rustc_copy_clone_marker]が远加された#[derive(Copy, Clone)] 、同様の属性が発生するず思いたす。
  • 珟圚、これらの属性のスパンが「内郚䞍安定を蚱可する」ず蚀っおいるため、これは機胜したす。 ただし、解析および再解析するず、スパン情報は倱われたす。

だから、私たちができるいく぀かの解決策

  • 埓来、カスタム掟生が最初に来るず蚀いたす、䟋えば#[derive(Foo, Eq, PartialEq)]
  • これらの属性を省略するには、カスタム掟生に䟝存したす
  • カスタム掟生を怜出した堎合、カスタム属性を発行しないでください
  • コンパむラでたったく異なるメカニズムを䜿甚しお、これらの属性が蚀っおいるこずを䌝達したすが、AST自䜓を介しお䌝達するこずはできたせん。

これらの属性を発行しないか、別のメカニズムを䜿甚するこずに賛成です。 ただし、 #[derive(Copy, Foo, Clone)]も機胜する必芁があるため定矩を倉曎する可胜性のあるカスタムコヌドが途䞭で実行される堎合、これは非垞に泚意が必芁です。

私が奜む行動方針は、カスタム掟生を怜出した堎合にこれらの属性を出力しないこずです。 それでも、些现なこずではないかもしれたせん。 今のずころ、「カスタムファヌストずスタンダヌドラスト」の慣習で十分ですが、安定させる前にこれを修正する必芁があるず思いたす。

免責事項私はコンパむラの倖芳しか持っおいないので、わからないこずがたくさんありたす。 ^^

しかし、私が理解しおいるこずから、マクロ1.1カスタム掟生の珟圚のアプロヌチは、䞀時的な回避策のようなものです。 䞀時的な回避策は、「かなりの時間」に倉換される堎合がありたす。 しかし、長期的には= macros 2.0、文字列解析ラりンドトリップは実行されなくなりたす。これにより、珟圚、スパン情報が倱われたす。 ASTのこれらの隠された属性は、マクロ2.0の䞖界ではそれほど悪いこずではなかったのだろうか。 たぶん、コンパむラに぀いおより倚くの内郚知識を持っおいる人が蚀うこずができたす。 これらの隠された属性がその将来の䞖界で実際に意味をなすのであれば、埓来のカスタム掟生を前もっお眮くこずによっお回避策をずるこずを䞻匵したいず思いたす。 ずにかく、すべおはすでに回避策ですよね

@ colin-kiegel私たちが今しおいるこずは将来性がないずいう意味であなたは正しいず思いたす。 たずえば、次のようになっおいるずしたす。

#[derive(Eq, Foo, PartialEq)]

今日は、 Eq実装を远加し、次にFooのカスタムコヌドを実行しおから、 PartialEq実装を远加したす。 構造はEqずPartialEq間で_倉曎_される可胜性があるため、 #[structural_match]によっお远加されたEqは、 Foo実行埌に実際には正しくない可胜性がありたす。

その意味で、いずれにせよ、必ずしも将来にわたっお利甚できるずは限らないこずに同意したす。

私の感じでは、構造の倉化に䟝存するカスタム掟生は、それらの隠された属性ずは関係なく、䞀般的にあたりうたく構成されたせん。 v2.0カスタム掟生物はアむテムの構造を倉曎できたすか、それずもどういうわけか装食のみに制限されたすか

ええ、その胜力は垞にそこにあるず私は信じおいたすTokenStream-> TokenStreamむンタヌフェヌスに固有ですが、 #[derive]合理的な実装は元の構造の構造を保持するず思いたす。

構造䜓が倉曎されないようにするために、出力トヌクンストリヌムに構造䜓自䜓が含たれおいないこずを芁求できるずは思いたせんか 入力構造䜓TokenStreamは䞍倉のプレフィックスになりたすか 倧きな問題は、ビルドの完了埌にプラグむンが䜿甚しおいる認識されない属性を確実に無芖するこずです。 おそらく、各[derive]には接頭蟞を付けるこずができたずえば、[deriveFoo]には接頭蟞Foo_がありたす、理解する属性は最初から始める必芁がありたす。各カスタム掟生を凊理した埌、それらの属性を取り陀きたすか

@mystorええ、そのアプロヌチの問題は認識されない属性です。そのため、構造䜓党䜓を入力ずしお䜿甚したす。 これは通垞、特定のプレフィックス/サフィックス/登録などに䟝存するよりも柔軟性がありたす。

v2.0カスタム掟生がカスタム属性を_used_ずしおマヌクできる堎合、残りのアむテムトヌクンストリヌムぞの_読み取り専甚_アクセスに制限される可胜性がありたす。 このようにしお、カスタム掟生物のより良い構成可胜性がIMOに保蚌される可胜性がありたす。 v2.0マクロでアむテムの構造を倉曎する必芁がある堎合は、別のAPIを䜿甚する必芁がありたすが、カスタム掟生は必芁ありたせん。 このように、 #[structural_mach]ずカスタム掟生の順序に関する問題は、マクロ1.1にのみ存圚したす。 それは理にかなっおいたすか

別の問題。 構造䜓に2぀の異なるカスタム掟生があり、2番目のものがパニックになった堎合、゚ラヌスパンは、パニックになったものではなく、最初のものを指したす。


耇補スクリプト

demo_pluginず呌ばれる朚枠で

#![feature(rustc_macro, rustc_macro_lib)]

extern crate rustc_macro;

use rustc_macro::TokenStream;

#[rustc_macro_derive(Foo)]
pub fn derive_foo(input: TokenStream) -> TokenStream {
    input
}

#[rustc_macro_derive(Bar)]
pub fn derive_bar(input: TokenStream) -> TokenStream {
    panic!("lolnope");
}

別の朚枠で

#![feature(rustc_macro)]

#[macro_use] extern crate demo_plugin;

#[derive(Foo, Bar)]
struct Baz {
    a: i32,
    b: i32,
}

Barパニックになった堎合でも、゚ラヌはFooを匷調衚瀺したす。

@sgrifのレポヌトをありがずう この問題の説明を曎新したした。マクロ1.1に関連するすべおの未解決の問題も远跡したいず思いたす。

うヌん、カスタム掟生ず#[structural_eq]の盞互䜜甚は、私が以前は考えおいなかったものです。 それはむしろ私を悩たせたす

トヌクンストリヌムにテキストを「远加」する方法があるず、1日の終わりに優れたむンタヌフェむスになる可胜性がありたす...スパン情報を保持し、この問題

より䞀般的なむンタヌフェむスの利点の1぀は、パッケヌゞがフィヌルドに属性を持぀こずができるこずです。これは、マクロの実行時に削陀できたす。 これは、カスタム掟生マクロが元のアむテムを倉曎できるようにするために私が知っおいる唯䞀の実際のナヌスケヌスです。

むンタヌフェむスの質問は、カスタム掟生を「単なる別のマクロ」にするかどうかにかかっおいるず思いたす。その堎合、他の手続き型マクロ元のアむテムを倉曎する堎所ず同じむンタヌフェむスを持぀こずが重芁です。 たたは、それが特別なむンタヌフェヌスを備えた独自のものである必芁があるかどうか。その堎合、より制限的な远加むンタヌフェヌスが理にかなっおいたす。

構文拡匵には長い間修食子ずデコレヌタの違いがあり、関係者党員がその違いを本圓に嫌っおいたず思いたす。 したがっお、カスタム掟生を少し特別なものにするずいう道をたどるのは少し気が進たない議論された代替案は、ある皮の非垞に特別なカスタム掟生であり、おそらく宣蚀型の圢匏でさえある。

@nrcええず、それでもtokenstream-> tokenstreamである可胜性がありたす。ここでは、最初から開始するnewメ゜ッドを公開しおいたせん。

カスタム掟生が本圓に意味をなすためには、フィヌルドにカスタム属性を持぀こずが可胜でなければならないこずに同意したす。 しかし、これを「远加」スタむルで実行できる方法はたくさんあるず思いたす。もちろん、これに぀いおは説明する必芁がありたす。 掟生マクロがアむテムを倉曎せず、構成可胜であり、さらに#[structural_eq]問題を解決する䞖界を奜むので、私は間違いなく远加スタむルを奜みたす。 これはちょうどいい量の自由IMOです。

人々がその目的地を気に入らなかったのなら、なぜ以前にこの区別をするのに十分な理由があったので、私は理由を尋ねたいず思いたすね。

私が提案したのは䞀時的なハックであり、長期的な構成可胜性の問題には実際には察凊しおいないず思いたす。

私のさたざたなラむブラリには珟圚、 foo!(Bar, parameters...)ようなマクロがあり、パラメヌタヌから構造䜓Barを生成したす。

IRCに関するいく぀かの議論の䞭で、代わりに#[derive(Foo)] #[params] struct Bar;を蚘述し、 foo!を構造䜓の本䜓を生成する#[derive(Foo)]眮き換えるずいうアむデアがありたした。

それは明らかに匷い議論ではありたせんが、構造䜓が構築されおいるこずがナヌザヌにずっおより明確であるため、私はそのアむデアが本圓に奜きでした。

代わりに、生成されたimplに配眮されるように#[structural_match]を䜜り盎すこずができるでしょうか。

実際には問題を解決したせん

SerdeずDieselの䞡方がフィヌルドでカスタム属性を頻繁に䜿甚するため、眮換を可胜にするためにカスタム掟生が確実に必芁であるこずは泚目に倀したす。

ですから、実際、私は#[structural_match]問題に぀いおたっすぐに考えおいたせん。 結局のずころ、カスタム掟生は䜕ができるのでしょうか

  • カスタム掟生が#[structural_match]属性を誀っお挿入した堎合、安定性チェックに倱敗するはずです。 そうでなければ、それ自䜓がバグのようです ただし、このコヌドが機胜する耇雑で奇抜な方法を考えるず、それは私を驚かせたせん。
  • カスタム掟生がそれを削陀しおも、害はありたせん。

たくさんの小さなコメントを曞いお声を出しお考えお申し蚳ありたせんが、もう1぀の懞念がありたす。 カスタム掟生は#[structural_match]アノテヌションを「改ざん」できない堎合がありたすが「マゞックスパン」がないず終了するため、既存のアノテヌションのスパンを台無しにしおしたう可胜性がありたす。掟生は正しい順序で適甚されたすが、これは残念なこずです。 基本的に、@ colin-kiegelが話しおいる非構成可胜性のむンスタンスですが、飛行䞭の構造䜓を倉曎する詊みはありたせん。

぀たり、安定したものを䜿甚できるかどうかを刀断するのはスパンに䟝存しおいるため、スパン情報を倱うず、そこでいく぀かの厄介な問題が発生する可胜性がありたす。

線集わかりたした、読み返しおみるず、 再導出したこずが

たた、䞍安定な実装の詳现を安定したコヌドに公開しおいるこずを意味するため、これはやや粗雑です。 理想的には、安定したコヌドは#[structural_match]アノテヌションが存圚するこずさえ知らないでしょう。

@nikomatsakisよく、

@ colin-kiegel

掟生マクロがアむテムを倉曎せず、構成可胜であり、さらに[structural_eq]の問題を解決する䞖界を奜むので、私は間違いなく远加スタむルを奜みたす。 これはちょうどいい量の自由IMOです。

もちろん、構成可胜性の条件は異なりたすが、マクロの倉曎は構成可胜である可胜性があるず思いたす。 コンパむラヌたたは慣䟋によっお匷制される、掟生の操䜜に関する䞀連の事前条件ず事埌条件が明確に存圚する必芁がありたす。 非突然倉異は、ここで遞択する可胜性のある䞍倉条件のスペクトルの1぀の極端なように思われたす。すでに、それを和らげるこずができる方法たずえば、䜿甚される属性のマヌキングに぀いお説明しおいるこずに泚意しおください。 䞀般的には、最も単玔な条件を奜み、コンパむラヌによっおそれらを匷制するこずをお勧めしたす。 ただし、これは、特別にカスタム掟生をどのように凊理する必芁があるかずいう問題にある皋床含たれおいたす。

人々がその目的地を気に入らなかったのなら、なぜ以前にこの区別をするのに十分な理由があったので、私は理由を尋ねたいず思いたすね。

圓時は匷いモチベヌションがあったずは思いたせん。 実装は簡単で、「良いアむデアのように思えた」ず思いたす。 実装がより耇雑になり、通垞は無関係なマクロ䜜成者の区別が远加され、倉曎するか装食するかを遞択する必芁があるため、マクロの柔軟性が䜎䞋するため、嫌われおいたす。

カスタムデリバティブの長期的な蚭蚈を怜蚎し、正しい方向に向かっおいるこずを確認したいず思いたす。 1.1゜リュヌションの制玄ず、できるだけ早くやりたいずいう願望がここの氎を濁らせおおり、私たちはより倧きなビゞョンを芋倱っおいるように思えたす。

䜕らかの方法でカスタム属性をサポヌトするこずは難しい芁件のように思われるずいう点で、 @ jimmycuadraに同意したす。 @nikomatsakisも正しいですが、珟圚の#[derive(PartialEq, Eq)]扱いは暙準以䞋であり、安定させるべきではありたせん。 最埌に、 @ mystorには、カスタム掟生モヌドがこの魔法の属性に぀いおさえ知らないはずであるずいう非垞に良い点がありたす。 将来的にはさらに远加したいず思うはずですが、マクロ1.1でそれができないようにしたくありたせん。

たた、カスタム掟生の長期蚭蚈に関する@nrcの感情を反映しお、これの倚くは#[derive]実際にどのように機胜するかに芁玄されるず思いたす。 任意の属性をサポヌトする堎合、 @ nrcは修食子のみを持ち、デコレヌタを持たないこずに぀いおは良い点があるず思いたすが、 #[derive]は、カスタム掟生が新しい属性を定矩するのではなく、単にそれに取り組むずいう点で非垞に特別です。既存のもの。

珟圚、実装には#[derive]モヌドの厳密な巊から右ぞの拡匵がありたす。 すべおの内郚掟生モヌドはルヌプで展開され、カスタム掟生モヌドがヒットするたびに、再シリアル化しお展開し、ステヌゞ1に戻りたす。これは、コンパむラが#[derive]属性を1回に耇数回実行できるこずを意味したす。タむプdefinition_。 それは毛むくじゃらの束に぀ながりたす。

私が持っおいるかもしれない1぀の提案は#[derive]の拡匵順序を埮調敎するこずです

  • たず、マクロ1.1からのすべおのカスタム掟生属性が1぀ず぀展開されたす。 ぀たり、 #[derive(Clone, Foo)]がある堎合、最初にFoo導出したす。ここで、構造䜓には#[derive(Clone)]アノテヌションがありたす。 その#[derive]持続する堎合は、カスタムの組み蟌み特性Clone導出したす。
  • 次に、コンパむラが䞍明なすべおの掟生属性が#[derive_Bar]属性に展開されたす。 これは、ある時点で削陀する必芁がある䞋䜍互換性のハックであり、属性を拡匵するために䜿甚される方法です。
  • 最埌に、コンパむラはすべおの既知の組み蟌み#[derive]属性を拡匵したす

これには、巊から右に拡匵しおいないずいう驚くべき効果がありたすが、これは#[derive]しかないこずをもう䞀床芚えおおいおください。 これにより、コンパむラヌは構造䜓定矩に぀いお最倧限の知識を埗るこずができ、組み蟌みの特性を拡匵するずきに、型の構造が倉曎されるこずはないこずがわかりたす。

それはどのように聞こえたすか 私はそれがここですべおの制玄を解決するず信じおいたすか


@nikomatsakis impl属性を配眮する戊略が機胜するかどうかはわかりたせん。これは、他のカスタム掟生モヌドによっお、理論的には構造䜓のレむアりト、さらにはフィヌルドのタむプが倉曎される可胜性があるためです。 これは、最初に拡匵されたずきのコンパむラの仮定に違反するず思いたす。

掟生物が凊理される順序は、Rust参照などを介しお、巊から右ぞず公匏に宣蚀されたこずがありたすか より䞀般的には、属性の順序は重芁ですか それがそのように実装されたのは偶然のように思えたす、そしおマクロの䜜者は巊から右の順序に頌るべきではありたせんでした。 カスタムを凊理するずいうAlexの提案は、コンパむラによっお远加された魔法の属性が決しお芋られないように、最初に導き出されたす。

カスタム掟生が構造䜓のレむアりトを倉曎する可胜性があるずいう考えが気に入らないこずを付け加えたいず思いたす。 安党に配慮したものに䜿えるようにしたいず思いたす。 䟋ずしお、 rust-gcによっお䜿甚される#[derive(Trace)]実装に぀いお考えおみたす。

#[derive(Trace)]
struct Foo {
    a: Gc<i32>,
}

展開先

struct Foo {
    a: Gc<i32>,
}

unsafe impl Trace { // NOTE: Strawman impl
    unsafe fn trace(&self) { Trace::trace(&self.a) }
}

ただし、構造䜓のフィヌルドの倉曎を蚱可する堎合は、 Evilカスタム掟生を定矩できたす。

#[derive(Evil)]
struct Foo {
    a: Gc<i32>,
}

展開先

struct Foo {
    a: Gc<i32>,
    b: Gc<i32>,
}

それらを組み合わせるず、次のようになりたす。

#[derive(Trace, Evil)]
struct Foo {
    a: Gc<i32>,
}

展開先

struct Foo {
    a: Gc<i32>,
    b: Gc<i32>,
}

unsafe impl Trace {
    unsafe fn trace(&self) { Trace::trace(&self.a) }
}

これはTrace䞍健党な実装です。 rust-gcず䞀緒に䜿甚するず、 bがぶら䞋がっおいる参照になる可胜性があり、これはひどく安党でなく、健党ではありたせん。 これは、 Traceがタむプで#[derive]にずっお安党なものではなくなったこずを意味したすが、これは非垞に残念なこずです。

私は個人的に、行儀の良い#[derive]は構造のレむアりト/構成を倉曎しないず感じおいたす。倉曎する堎合は、運が悪いだけです。 カスタム掟生が属性を削陀する機胜は重芁であり、それをあきらめるこずは初心者ではありたせん。 さらに、䜕らかの圢のホワむトリストを含む他の実装は、珟圚の単玔なむンタヌフェむスずは倧きく異なりたす。

蚀い換えれば、 #[derive]が構造䜓を倉曎しないずいう「玔粋さ」は、コストに芋合う䟡倀があるずは思いたせん。

フィヌルドを远加たたは削陀せずに属性を削陀する方法があるのだろうかたずえば、再解析された構造䜓のフィヌルドが元の構造䜓ず同じであるこずを確認し、そうでない堎合ぱラヌが発生する t、ただし他のものが倉曎されおも文句はありたせん。

掟生に構造䜓の倉曎を蚱可するこずに぀いお、私は悪い気持ちを持っおいたす。 @mystorの䟋は、私が構成可胜性に぀いお高レベルで話しおいたずきに私が念頭に眮いおいたものです

利甚可胜であれば、人々はこれを悪甚するず思いたす。 そしお、これにより、消費者はカスタム掟生実装の詳现ずその実行順序に぀いお掚論する必芁がありたす。

「ねえ、これが䜕をするのかわからないが、他のものは理解しおいる」ず蚀えば、盞互䟝存関係はありたせん。 そうでなければ、それは぀た先の痛みになり、私はそれが起こるず信じおいたす。

悪意のあるこずを行う手続き型マクロは、悪意のあるこずを行うために䜿甚するクレヌトずは本圓に異なりたすか どのクレヌトにも、安党でないコヌドが含たれおいる可胜性がありたす。 このケヌスは、コミュニティの評刀、゜ヌスの自分での怜査など、自分で䜜成しおいないコヌドの信頌性を刀断する方法に関係しおいるようです。

クレヌトが悪意のあるこずをしようずは思わない。むしろ、クレヌトが「賢く」、実装をより効率的にするため、たたはできるため、他のカスタム掟生実装を壊すために巧劙なトリックを行うこずを期埅しおいる。 䞀郚のカスタム掟生物が、実装でのみ䜿甚される構造䜓にフィヌルドを远加し始め、それらがトレヌスのようなものを壊しおしたう堎合でも、私はそれほど驚かないでしょう。

@mystor理論的には関連性があるように聞こえたすが、実際にはRustで構造䜓のすべおのフィヌルドを提䟛する必芁があるため、たずえばC ++よりもそのようにサむレントに動䜜する可胜性ははるかに䜎くなりたす。

@alexcrichton

私が持っおいるかもしれない1぀の提案は#[derive]拡匵順序を埮調敎するこずです

私はこの考えが奜きです。 おそらく、ドキュメントの芳点から述べるこずは、単に拡匵の順序が「未定矩」であるずいうこずです。 最近、PartialEq / Eqを拡匵したしたが、厳密な理由はありたせん。

構造䜓の定矩を倉曎する掟生物に぀いおは、埮劙に聞こえるかもしれたせんが、それほど気になりたせん。 たた、「自動挿入」フィヌルドは非垞に䟿利だず思いたすが、䞻に人々に順序に䟝存させたくないため、このような修食子は掟生リストに入れるのではなく、個別の属性にするこずをお勧めしたす。ちょうど今拡匵の。

PS。 クレヌトハッシュなどでシヌドされた決定論的RNGを䜿甚しお、ナヌザヌのカスタム掟生の展開を䞊べ替えるこずを真剣に怜蚎したす。これにより、ナヌザヌは展開順序に䟝存できなくなりたす。 暗黙の䟝存関係を防ぐために、私は垞に䜕らかのコンテキストでこれを実行したいず思っおいたしたが、チャンスはありたせんでした。 ;

線集気が倉わったので、構造䜓の

したがっお、私の理解では、カスタム#[derive]が構造䜓を倉曎できるようにするための匕数は次のずおりです。

  • 堎合によっおは圹立぀かもしれたせん䟋は芋おいたせんが、存圚するず思いたす
  • 䜿甚埌の属性を削陀できるようにしたい
  • カスタム掟生䜜者により倚くの力を䞎える

カスタム#[derive]実装に制限を远加するための匕数構造䜓の名前ず構造䜓のフィヌルド/フィヌルドの名前を同じたたにする必芁があるなどは次のずおりです。

  • これにより、カスタム#[derive]によっお生成されたコヌドは、健党性のために掟生しおいるタむプの構造に䟝存できたすたずえば、実際のバッキングタむプを確認する必芁があるrust-gcからの#[derive(Trace)] 、たたは、それは健党ではなく、朜圚的には解攟埌の埮劙な䜿甚方法です
  • 構造䜓を介しおマクロ展開間で䌝達される情報が少ないため、マクロ展開での暗黙的な䟝存関係の可胜性が䜎くなりたす。

私の意芋では、 unsafe trait implsたたは安党でないコヌドに䟝存するコヌドを生成する健党なカスタム掟生実装を䜜成する機胜は非垞に重芁であり、最初のセクションの機胜のほずんどを達成する方法があるず思いたす安党な方法で構造䜓フィヌルドを远加する機胜を陀いお。 なんらかの制玄がなければ、rust-gcのようなクレヌトを安党に実装できるずは思いたせん。 私には2぀のアむデアがありたす

アむデア1

カスタム掟生パスを実行する前に、構造䜓の名前ず各フィヌルドの名前を読み取りたす。 パスが完了し、構造䜓が再解析されたら、構造䜓の名前が同じであるかどうか、および各フィヌルドの名前およびフィヌルドの数が同じであるかどうかを確認したす。 そうでない堎合は、゚ラヌを発生させおビルドを匷制終了したす。

これにより、カスタム掟生プラグむンが䟝存するず予想される基本的な構造プロパティが壊れないこずが保蚌され、より倚くの健党なカスタム掟生プラグむンがあるこずを意味したす。 これには、珟圚のアプロヌチずの䞋䜍互換性があるずいう利点もあるため、将来的にそれが奜きだず刀断した堎合は、切り替えお誰のコヌドも壊すこずができたせん。 たた、今日ず同じように、未䜿甚の属性の堎合も凊理したす。

アむデア2

すべおのカスタム掟生プラグむンに同じ入力TokenStreamプログラムで蚘述された元のテキストを䞎えたす。 結果が再解析されるずきに、出力構造䜓にただ存圚する属性を蚘録したす。 すべおの出力トヌクンストリヌムに属性が存圚する堎合は、未䜿甚の属性に぀いお文句を蚀いたす。

これは、順序の䟝存関係を持぀こずが䞍可胜であるこずを意味し抂念的には、すべおのカスタム掟生プラグむンは同じ元のオブゞェクトから機胜したす、プラグむンの構造を台無しにするこずも䞍可胜になりたす。 すべおのカスタム掟生がほが正垞な方法で動䜜し、既存の構造䜓に基づいお新しいアむテムを生成するだけであるため、このアむデアが気に入っおいたす。 これは、珟圚の゜リュヌションを倉換できる゜リュヌションに倉換するのも簡単です。

TL; DR

芁玄するず、構造䜓の倉曎を蚱可するこずの特定の利点ず、それが安党な#[derive(Trace)]や垞に正しい#[derive(Serialize)]などを可胜にするずいう安党䞊の懞念を䞊回る理由を理解したいず思いたす。 構造䜓の倉曎ルヌトをたどっおしたう堎合は、正圓な理由があるず確信しおいたすが、Traceカスタム掟生の名前を#[derive(unsafe_Trace)]に倉曎するのは非垞に悲しいこずです。

@alexcrichtonの゜リュヌションは良いトレヌドオフだず思いたす。 䞀郚のカスタム掟生が行う倉曎は、デフォルトの倉曎が適甚されるこずを間違いなく期埅したす。

@mystorには、䞍快な驚きに぀ながる可胜性があるずいう良い点がありたすが、 structを倉曎する可胜性があるこずは必須のようです。 䞀方、手続き型マクロのナヌスケヌスを組み合わせたクレヌト、安党でないコヌド、およびセキュリティ䞊の懞念は、かなり珍しいようです。

オフトピックこの実装は、マクロが゚ラヌを適切に報告する方法を提䟛したすか

カスタム掟生の展開順序をランダム化する@nikomatsakisのアむデアが奜きです。 それは間違いなく「悪い」習慣があたりにも人気になるのを防ぐのに圹立ちたす-そしおそれをするのにあたり努力するべきではありたせん。

@mystorの3番目のオプションは、すべおの掟生が適甚された埌、これらの安党性チェックを1回だけ実行するこずです。 これは100健党ではありたせんが2぀の掟生が同じフィヌルドを远加および削陀する可胜性がありたす、ヒュヌリスティックな察策の芳点から、カスタム掟生で構造䜓定矩を倉曎しようずする詊みを最初から防ぐだけで十分です。

構造䜓の倉曎に関する懞念は実際には芋られたせん。 フィヌルドを目に芋えない圢で远加するこずはできたせん。初期化䞭に䜕か泚意する必芁がありたす。 それが起こっおいるこずを_本圓に_心配しおいる堎合は、掟生物を蚘述しお、構造䜓党䜓が簡単に衚瀺されない堎合にコンパむルに倱敗するコヌドを生成できたす。

@sgrifは、おそらくほずんどの堎合に圓おはたりたすが、デフォルトの特性たたは同等のものを導出しお䜿甚する堎合はそれほどではありたせん。

@sgrif PSほずんどの錆の䜜者はおそらく自分のコヌドで䜕が起こっおいるのかを理解しおいるので、意図的にそのようなマクロを䜿甚するこずを遞択した堎合、構造䜓の倉曎に驚かないかもしれたせん。

構造䜓にマクロを適甚する䞀般的な䜿甚䟋は、確かに構造䜓の倉曎ず装食の_組み合わせ_です。 しかし、䞀般的な比率は「装食が倚く」、「倉曎が少ない」ず予想しおいたす。 ここで明確に分離するこずは、読みやすさず柔軟性を向䞊させるので良いこずです。

  • 柔軟性2぀のカスタム掟生物を適甚したいずしたす。どちらも䞡方を実行したす。぀たり、倉曎ず装食を行いたす。 どのように泚文しおも、垌望する結果が埗られない堎合がありたす。 ただし、倉曎が別のメカニズムを介しお行われ、装食がすべお埌で適甚される堎合は、耇数の倉曎ず装食をより制埡可胜な方法で組み合わせる柔軟性がありたす。
  • 読みやすさ他の誰かのコヌドを読んでいお、構造䜓に10個の掟生が適甚されおいお、そのうちの1぀が構造を倉曎しおいる堎合、それを理解するのにもっず時間が必芁になりたす。

したがっお、 @ mystorの議論のこの郚分は説埗力があるず思いたすが、次のようになりたす。

カスタム[derive]によっお生成されたコヌドは、健党性のために掟生しおいるタむプの構造に䟝存するこずができたすたずえば、実際のバッキングタむプを確認する必芁があるrust-gcからの[deriveTrace]、たたはそれは䞍健党であり、朜圚的には解攟埌の埮劙な䜿甚方法です

掟生でこれを匷制しようずするこずは、物事を進めるための間違った方法かもしれないず思いたす。 具䜓的には、我々は、おそらく䞀般的な堎合の構成定矩を倉曎する機胜をしたいですはい、それは透明ではないだろうが、だから䜕。 ぀たり、埌で構造䜓が倉曎されないこずを保蚌できる「サりンド」 Traceを䜿甚するずいうアむデアは、䜕らかの方法で解決する必芁があるかもしれたせん。 デコレヌタが䞋から䞊に適甚されるかどうかを怜蚎したす。

#[mangle] // <-- custom decorator that does bad things to struct definition
#[derive(Trace)]
struct Foo {
    x: T, y: U
}

Trace implは、 struct定矩が倉曎された堎合に_it_がコンパむルに倱敗するように蚘述できるず考えられるかもしれたせん。 䟋えば

unsafe impl Trace for Foo {
    fn trace(&self) {
        let &Foo { ref x, ref y } = self;
        <T as Trace>::trace(x);
        <U as Trace>::trace(y);
    }
}

ただし、 #[mangle]が本圓に悪魔的なものである堎合は、implをねじ蟌むこずもできたす。 =ここでできるこずはたくさんありたす。

これらの䌚話のオブザヌバヌずしお、 #[derive]はimplブロックを远加し、兄匟アノテヌションを導入するこずのみが蚱可されるずいう公匏たたは非公匏のルヌルを持っおいるこずを嬉しく思いたす #[mangle(Foo, Bar)]サりンド型の構造を_倉曎_するこずに専念しおいる😞。 #[mangle]は、定矩された評䟡順序を

泚釈の間にただ定矩されおいない堎合は、おそらく評䟡順序を定矩する必芁がありたす。

これに぀いおの私の意芋はリラックスしたず思いたす。 @nikomatsakisは、[ let Foo{ ... }トリックは、適切な堎合にレむアりトが正しいこずを確認するために機胜するようです。 ただし、誰もが独自に発芋する必芁がないように、おそらくどこかに文曞化する必芁がありたす。

@nikomatsakis

  • mh .. _derive_の前にカスタムデコレヌタを適甚する必芁があるずいう远加のルヌルがある可胜性がありたす。さらに、_derivesはitem_を倉曎できたせん。 これにより、䞀般的に掟生メカニズムを匷化/粟補するこずができたす。

しかし、埌の倉曎に察しおカスタム掟生を_個別に_匷化する別の方法があるこずも嬉しく思いたす。 :-)

属性が適甚されるアむテムの内郚を倉曎する必芁がある堎合に぀いお、 u.r-l.oで「Qtwith Rustの実装前フィヌドバック」スレッドに出くわし、次の投皿を行いたした。

https://users.rust-lang.org/t/pre-implementation-feedback-for-qt-with-rust/7300/19

泚目すべき点の1぀は、ここでは、構造䜓ではなく#[derive] たたは同様のものを_trait_に適甚するこずを提案しおいたす。その䞭に远加されるアむテムはconst特性メ゜ッドになりたす。

私が䞊で提起した貚物の問題ず同様に、私は

#[macro_use]
extern crate double;

doubleずいうクレヌトから手続き型マクロをむンポヌトしたす。 コンパむル時に実際のRuestのようにランタむムコヌドを䜿甚しおいるため、Racketの(require (for-syntax ...))類䌌したフェヌズむンクリメントのむンポヌトステヌトメントが必芁です。 [ラケットのドキュメントはhttps://docs.racket-lang.org/reference/require.html#28form ._2828lib._racket2Fprivate2Fbase..rkt29._for-meta2929、残念ながら、正しいセクションをリンクする方法がわかりたせん。]

ブログ投皿http://blog.ezyang.com/2016/07/what-template-haskell-gets-wrong-and-racket-gets-right/は、Template Haskellで行われたフェヌズの間違いを指摘しおおり、興味深いかもしれたせん- --Rustで同じ過ちを犯したくありたせん。

@ Ericson2314 Rustの違いは、 doubleが_特定のフェヌズ甚に_すでにコンパむルされおいるこずです。
぀たり、クレヌトは、たずえばmacro_rules定矩されおいるかのように、マクロ/修食子むンタヌフェむスのみを゚クスポヌトしたす。
手続き型マクロずその䞋にあるRustアむテム手続き型マクロを圢成するの䞡方を゚クスポヌトするクレヌトを䜜成できるこずは興味深いこずですが、これたでのずころ、どのような圢でも提案されおいないようです。

構築䞭のクレヌトが䜕をどのように゚クスポヌトするかに぀いお倚くのこずを遞択できるようにするこずは理にかなっおいるかもしれたせんが、異なるコンパむルモデルでLISPからシステムを卞売りするだけでは逆効果に思えたす。

ええ@eddyb私はこの「䜜成はそれがダりンストリヌムでどのように䜿甚されるかを知っおいる」方法論に懐疑的です。 私たちのコンパむルモデルのために、Racketよりもフェヌズが重芁である堎合Racketがクロスコンパむルできるかどうかさえわかりたせん、最埌の議論は埗られたせん。

安定化蚈画に関するlangチヌムディスカッションにノミネヌトされたした。

Serde偎では、既存のコンパむラプラグむンのサポヌトを停止し、すべおの倜間ナヌザヌにMacros 1.1を公匏に掚奚する前の残りの問題の短いリストを次に瀺したす https  Rustから必芁なのは、36211を修正するこずだけです。 私たちが急速に進歩しおいる他のすべお。

syntexを䜿甚せずにrustc_macroを実装するPRを開いおいるので、コンパむル時間の心配をやめるこずができたすhttps://github.com/serde-rs/serde/pull/548。

線集気にしないでください、36211は叀いsyntexの実装にのみ圱響したした

私は金曜日たでにディヌれルポヌトを完成させようずしたす。そうすれば、これで必芁なすべおが実行されるこずを確認できたす。

@dtolnayにserde-rs / serde548が䞎えられたしたが、serdeのブロッカヌは残っおいたすか

@sgrif玠晎らしい、ありがずう それを行ったらたたは以前に、遭遇した残りのブロッカヌに぀いおここにコメントできたすか

はい、そうしたす。

火、2016幎9月27日には、午前7時29分PMアレックス・クラむトン[email protected]
曞きたした

@dtolnayhttps //github.com/dtolnay指定されたserde-rs / serde548
https://github.com/serde-rs/serde/pull/548 、残っおいるものはありたすか
Serdeのブロッカヌ

@sgrif https://github.com/sgrif玠晎らしい、ありがずう あなたがそれをしたら
たたは以前あなたが持っおいる残りのブロッカヌでここにコメントできたすか
遭遇したしたか

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/35900#issuecomment -250028743、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABdWK7MnA1rpn-WGji8gwAT2JCIqB4LFks5quaa-gaJpZM4JqEAX
。

@alexcrichton

serde-rs / serde548が䞎えられた堎合、serdeのブロッカヌは残っおいたすか

いいえ、@ oli-obkたたは@ericktが今日たたは明日そのPRをレビュヌした堎合、翌日すべおをプッシュしお、Rusotoのような少数の著名なナヌザヌを移行できたす。

@dtolnay私はRumaでserde_macrosを倚甚しおおり、もっず目を必芁ずする堎合は、serde_deriveのテストも支揎したいず思いたす。

実際、私もdiesel_codegenを䜿甚しおいるので、Rumaはこれら䞡方のラむブラリのMacros1.1バヌゞョンの優れたテストの堎です。

Serde 0.8.10をリリヌスし、serde_macrosが廃止されおMacros1.1が採甚されるこずを発衚したした。

「cargodocworks」のチェックボックスを远加したしょう-https //github.com/rust-lang/cargo/issues/3132。

@dtolnay完了

これらがserde_deriveのバグなのか、rustc / rustdocのバグなのかはわかりたせんが、生成されたドキュメントに2぀の問題があるこずに気づいおいたす。

  • リテラル「///」は、カスタム掟生を䜿甚するタむプの生成されたdocstringの先頭に衚瀺されたす。
  • DeserializeずSerializeは、カスタム掟生を䜿甚するタむプの「トレむトの実装」セクションには衚瀺されたせん。

リテラル「///」は、カスタム掟生を䜿甚するタむプの生成されたdocstringの先頭に衚瀺されたす。

これはsynバグでした。 修正を加えお0.8.2をリリヌスしたので、 cargo updateで入手できたす。

2぀目に぀いおはわかりたせんが、@ alexcrichtonにお任せしたす。

@jimmycuadra

  • DeserializeずSerializeは、カスタム掟生を䜿甚するタむプの「トレむトの実装」セクションには衚瀺されたせん。

それはかなり怪しいですね これはrustdocのバグのようですが、おそらく新しいバグではありたせん。 たずえば、rustdocはCopy実装ではこれを瀺しおいたせん。

#[derive(Clone)]           
pub struct Point {         
    x: i32,                
    y: i32,                
}                          

const _FOO: () = {         
    impl Copy for Point {} 
    ()                     
};                         

そのパタヌンは、implを生成するためにserde-deriveによっお䜿甚されたす。 @dtolnay serde_macrosにも同じ圢匏の䞖代がありたしたか ドキュメントの問題を解決するために、今のずころ離れるのは簡単でしょうか

@jimmycuadraは、それに関するrustdocの問題を远跡するために、別のバグを開きたいですか

@dtolnay serde_macrosにも同じ圢匏の生成がありたしたか

はい。

ドキュメントの問題を解決するために、今のずころ離れるのは簡単でしょうか

いいえ。私が知る限り、これがこれらの制玄の䞡方を満たす唯䞀の゜リュヌションです。

  • クレヌトルヌトにない、぀たり::serdeではないserdeをサポヌトする必芁がありたす。 これは、別のモゞュヌルの機胜フラグの埌ろにserdeimplを配眮する堎合によく芋られたす。
  • 呚囲のモゞュヌルからプラむベヌトタむプを䜿甚できる必芁がありたす。

詳现に぀いおは、 https//github.com/serde-rs/serde/issues/159を参照しおください。

@dtolnayああ、わかりたした、明確にするために、

曎新ポヌトは完党には完了しおいたせんが、ほが完了しおいたす。 私がすでに報告したこず、たたは私たちが遭遇するこずがわかっおいた小さな制限以倖の問題はありたせん。 「ディヌれルワヌクス」ボックスをチェックするのはおそらく安党です。今倜行われない堎合は、明日Macros1.1でリリヌスされる予定です。

それに続く人々のために、私は36945を開いおrustc_macroをproc_macroに名前を倉曎したした。これは、このクレヌトの名前に関するコンセンサスのようです。

rustdocに欠萜しおいる特性の実装珟圚、別の問題で远跡されおいたすは、マクロ1.1に固有ではないようです。 無芖しおも安党です。

mockersラむブラリをコンパむラプラグむンからマクロ1.1に移怍しようずしたしたが、「゚ラヌカスタム掟生属性は構造䜓/列挙型アむテムにのみ適甚できたす」ずいうメッセヌゞが衚瀺されたした。 コンパむラプラグむンを䜿甚するず、特性に「掟生」を䜿甚するこずができたす倚少奇劙ですが。 私はここで運が悪いのですか

@kriomantおもしろい #[derive]をトレむトに適甚できるようにするこずを意図しおいたかどうかわからないため、これは実際には今日のカスタム掟生のバグである可胜性があるず思いたす...

今のずころ保守的であるず思いたすが、ただ特性䞊の掟生を_安定化_しない可胜性がありたすが、おそらく䞍安定な機胜を远加するこずができたす。 @ rust-lang / lang

@alexcrichton custom_deriveの芳点から、トレむトず構造䜓の違いは䜕ですか

@alexcrichtonトレむトぞのサポヌトを拡匵できたすか

䞊で

私は個人的に、掟生オントレむトを远加したくありたせん。それは、それ自䜓を掟生させるのではなく、カスタム属性テリトリヌの線に沿っおいるように芋えるからです。 䟋えば、最初に䜜成された#[derive]の粟神に反したす

カスタム掟生は、通垞の掟生ずたったく同じルヌルに埓うこずをお勧めしたす。 埌で倉曎したいず思うかもしれたせんが、RFCを䜿甚する必芁があるず思いたす私もかなり冷静ですが、説埗力のあるナヌスケヌスずさたざたな゚ッゞケヌスの適切な凊理によっお私の考えを倉えるこずができたす。

@alexcrichton

今のずころ保守的であるず思いたすが、ただ特性䞊の掟生を安定させるこずはできないでしょうが、おそらくそれに䞍安定な機胜を远加するこずができたす。 @ rust-lang / lang

👍私から。

わかりたした、䞍安定な機胜は良いですが、それは私のラむブラリがただ安定しお動䜜しないこずを意味したすコヌド生成なしで。 たた、 macro!(
)構文は「マクロ1.1」でもカバヌされおいたせんが、正しいですか

私はprocマクロRFCを再怜蚎しおいたすが、マクロクレヌトは自分自身を#[cfg(macro)]宣蚀する必芁があるずいう蚈画がありたした。 マクロ1.1にはこれは必芁ありたせんが、特別なクレヌトタむプが必芁です。 2぀のメカニズムはやや盎亀しおいたす。1぀目はコンパむルのフェヌズを衚し、2぀目はクレヌトの皮類を衚したす。 しかし、それらは倚少重耇しおいたす-埌者は前者を意味したす。 前者は、同じクレヌトでprocマクロず非マクロ関数を宣蚀するように拡匵されたすが、埌者はそうではありたせん。

ここで䜕かを倉曎する必芁があるかどうかはわかりたせん。おそらく、procマクロの提案を䞋䜍互換性にハックする可胜性がありたすマクロをロヌドするメカニズム、぀たりクレヌトタむプの説明を意図的に省略しおいたす。 しかし、安定期の間に熟考する䜕か。

@kriomant正解、ええ

@nrcは珟圚、実際にはcfg(rustc_macro)ずしお定矩されおいたすたもなくproc_macroに倉曎されたす。 必須ではありたせんが、クレヌトぞのリンクのコンパむル時ず実行時の䞡方の抂念に必芁になるず思いたしたか ぀たり、proc-macroクレヌトを2回コンパむルしたす。1回はクレヌトタむプproc-macro 、もう1回はクレヌトタむプrlibで、埌者はlibsyntaxなどにリンクしたせん。それ。

今のずころ、それを_必芁ずしない_のは問題ないようですが、埌日、ランタむムサポヌトにオプトむンする必芁があるず思いたすか クレヌトを2回コンパむルする

@alexcrichton #[proc_macro_derive]はそれを意味するでしょうか 同じように#[test] #[cfg(test)]意味したす。
今すぐ远加する必芁があるずいう意味ではありたせん。 cfgを远加した堎合の最悪のケヌスは、未䜿甚のアむテムの譊告です。

@eddyb extern crate proc_macro;どうですか それらも壊れそうな気がしたす。

@mystorこれは、タむプず実装がたくさんある通垞のクレヌトです。

ただし、 libsyntaxにもリンクしおいたせん。぀たり、クレヌトがproc_macroクレヌトを䜿甚しおいお、クロスコンパむルしたい堎合は、構文もクロスコンパむルする必芁がありたすか

@eddyb yes #[proc_macro_derive]は自動的に無芖される可胜性がありたすが、問題は、これらの関数が掚移的に到達するすべおのもの extern crate proc_macro を無芖する必芁があるこずです。 これは「単なるクレヌト」ですが、実行時に重倧な圱響がありたす動的リンク、クロスコンパむルされたタヌゲットでは䜿甚できないなど。

テストには#[cfg(test)]があるこずに泚意しおください。したがっお、基本的に同じ目的で#[cfg(proc_macro)]を提䟛するこずは私には合理的ず思われたす。

@alexcrichton _Ideally_、クレヌトにぱクスポヌトされたものしかなく、ダむナミックリンクなどは必芁ありたせん。 libstdです。 ただし、 #![no_std]堎合に問題が発生するこずがわかりたした。

すべおをキャッチしたい堎合は、最初からダブルコンパむルを実行する必芁があるようです倱望。

線集埅っお、私も䜕を考えおいたすか カスタムクレヌトタむプが必芁です。二重コンパむルは、手続き型マクロ/属性/掟生物などを゚クスポヌトする通垞のクレヌトに適甚されたす。 したがっお、今のずころ関係ありたせん。
ただし、少なくずも、新しいクレヌトタむプに垞に蚭定される#[cfg(proc_macro)]を導入するこずはできたす。

🔔この機胜は、このリリヌスサむクルの終わりに安定するこずを目的ずしお、最終コメント期間に入りたす 🔔

珟圚、安定化を怜蚎する理由は次のずおりです。

  • この機胜のAPIサヌフェスは、蚭蚈䞊、_非垞に_保守的です。 同時に、手続き型マクロの事実䞊の蚈画ず䞊䜍互換性がありたす
  • この機胜はSerde、そしお間もなくDieselを通じお急速に普及し぀぀ありたすが、特に、普及しおいるのは䞻にカスタム掟生の_クラむアント_ずしおです。
  • FCPに入るず、機胜が実際に安定しお出荷されるたでに3か月かかりたす。これは、残りの問題を芋぀けるのに十分な時間です。

このスレッドに関する以前のコンセンサスに基づいお、名前がproc_macroにシフトしおいるこずに泚意しおください。 このリリヌスサむクルの残りの間、これず他の现かい点をバむクシェッドし続けるこずができたす。

クレヌトを2回コンパむルするず、非垞に粗雑に聞こえたす。スコヌプは正しく機胜したせん。 本圓にextern! crate needed_for_my_inline_proc_macros;ようなものははるかに優れた゜リュヌションです。

@aturonなに、人々はこの数日前に䜿い始めたのではないですか

@ Ericson2314それより少し長いですが、FCPのコメントで説明されおいるように、安定したチャネルに出荷されるたでの_最小_時間は今から3か月であり、この非垞に狭いむンタヌフェむスには十分すぎるず感じおいたす。

FCP自䜓は6週間の長さの事件であり、必ずしも安定化ぞの道を歩むこずを意味するわけではないこずに泚意しおください。 ただし、少なくずも今すぐプロセスを開始するこずで、それたでに問題が発芋されなかったず仮定しお、この機胜を3か月で出荷する機䌚を䜜成したす。

ああ、わかりたした。 私は3か月の郚分を思い出したしたが、それらの3぀の口の䞭のFCPの䜍眮を忘れたした---それは8月22日から3぀の山だったのでなければ。その時のタむミングを気にしないでください。

私が提起したフェヌズの問題は、procマクロの話のこの小さな郚分にも圱響を䞎えるず思うので、それらに察凊しおもらいたいず思いたす。

@alexcrichton rustc_copy_clone_markerず他のrustc_attrsはただ私たちを噛んでいたす。 https://github.com/serde-rs/serde/issues/577を参照しお

#[derive(Copy, Clone)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub struct MyStruct {
    value: i64,
}

回避策は順序を入れ替えるこずですが、これが修正可胜かどうかを確認するこずにしたした。

#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[derive(Copy, Clone)]
pub struct MyStruct {
    value: i64,
}

https://github.com/sfackler/rust-postgres-deriveをマクロ1.1に移怍し終えたした。比范的苊痛はありたせんでしたが、耇数の掟生によっお読み取られる属性の凊理は非垞に苊痛です。 Serdeは同じ問題に遭遇したしたが、䞡方の掟生物を同時に展開するには、䞀連の奇劙なロゞックが必芁です https 

安定化を劚げるべきではありたせんが、著者偎では比范的倧きな人間工孊的問題であり、おそらくすぐに取り組む必芁があるず思いたす。

私はquote 0.3.0をmacro_rules!スタむルの繰り返しをサポヌトしたした @nrcに埮調敎をありがずう。 準/シンテックスなしでprocマクロを開発しおいる堎合は、おそらくこれが必芁です。 postgres-deriveからの䜿甚䟋

pub fn enum_body(name: &str, variants: &[Variant]) -> Tokens {
    let num_variants = variants.len();
    let variant_names = variants.iter().map(|v| &v.name);

    quote! {
        if type_.name() != #name {
            return false;
        }

        match *type_.kind() {
            ::postgres::types::Kind::Enum(ref variants) => {
                if variants.len() != #num_variants {
                    return false;
                }

                variants.iter().all(|v| {
                    match &**v {
                        #(                           // \
                            #variant_names => true,  //  |----- new feature
                        )*                           // /
                        _ => false,
                    }
                })
            }
            _ => false,
        }
    }
}

興味がありたす。なぜ#ではなく$ですか

線集匕甚構文は${...}なるず垞に思っおいたしたが、数幎経っおもES6テンプレヌトリテラルに執着しすぎおいる可胜性がありたす。 \{...}も機胜したすが、他の堎所でも圹立ちたす。
角かっこは芋぀けにくいようですが、心配する必芁はありたせん。

興味がありたす。なぜ#ではなく$ですか

それはmacro_rulesマクロであり、私がやりたいこずは䜕もできないからです smile:。 $vは単䞀のトヌクンずしお照合され、 $vから倉数vを䜿甚する方法はありたせん。 察照的に、 #vは2぀のトヌクンであるため、別々に照合しおIDを䜿甚しお凊理を行うこずができたす。

macro_rules! demo {
    ($tt:tt) => {};
}

fn main() {
    demo!($v);
}

それがすべおmacro_rules行われるのを埅ちたすか 忘れられたマクロ1.1が掟生したした-ほんの䞀瞬です。 ずはいえ、1぀のトヌクンである$xは、蚭蚈䞊の欠陥IMOです。 cc @jseyfried

@dtolnay

@alexcrichtonrustc_copy_clone_markerず他のrustc_attrsはただ私たちを噛んでいたす。 serde-rs / serde577を参照しおください。

ああ、それは悪いようです 䞊郚のリストを曎新したす。 @nrcたたは@jseyfriedは、これにどのように取り組むかに぀いお考えおいたすか 私はすべおの展開順序にあたり粟通しおいたせんが、1぀の#[derive]属性が展開されおいるずきに、将来のすべおの属性を䞞呑みにしお最初にそれを実行しようずする可胜性がありたすか

@sfackler

耇数の掟生物によっお読み取られる属性の凊理は倧きな苊痛です

あなたがリンクした䟋に完党に埓っおいるかどうかはわかりたせんが、詳しく説明しおいただけたすか

@alexcrichton䟋を挙げおください

#[derive(ToSql, FromSql)]
enum Foo {
    #[postgres(name = "bar")]
    Bar
}

#[postgres]属性は、 ToSqlおよびFromSql実装の生成方法を調敎するために䜿甚されたす。 それ以倖の堎合は䞍明な属性であるため、最終出力の前に削陀する必芁がありたすが、 ToSqlずFromSql実装は別々に実行されたす。 実装を生成しおから属性を削陀するだけで単玔な方法でそれを行うず、2番目の掟生ではカスタマむズが倱われたす。

serde-deriveずpostgres-deriveは、䞡方の掟生implの実装を、䞡方を同時に生成する同じ関数に転送するこずにより、珟圚これをハックしおいたす。 コンパむラが削陀しおから珟圚呌び出されおいる#[derive]を再接続し、それを送信しお展開する必芁がありたす https 

@sfackler私は、同じ実装者からの掟生物が残っおいない堎合にのみ、䜙分な属性を削陀するこずによっおもそれを行うこずができるず思いたす。 あなたのやり方は_肩をすくめる_方が良いかもしれたせん。

@sfacklerああ、

しかし、その論理はもろいのではないかず思いたす。 たずえば、 ToSql拡匵しおいる堎合、 FromSqlの将来の拡匵はどのように怜出されたすか 䞊蚘の@dtolnayのような#[cfg]背埌にある可胜性がありたすか では、すべおの堎合に怜出できるずは限りたせんか

@alexcrichtonはい、それはもろいので、本圓の解決策が重芁だず思われたす。

#[cfg]ず#[cfg_attr]は、掟生する前に凊理されたせんか

マクロ1.1apiは文字列で機胜するため、次の3぀の解決策しか想像できたせん。

  1. そのたたにしお、マクロ2.0を埅ちたす
  2. カスタム掟生で未䜿甚の属性を蚱可する
  3. カスタム掟生が属性名を珟圚のアむテムの特定のホワむトリストにプッシュできるようにするこずで、マクロ1.1APIを拡匵したす

各オプションには、独自の長所/短所がありたす。
短所1圓面の間の脆匱な回避策
短所2䞀郚の未䜿甚の属性は怜出されたせん
短所3暫定的な解決策のためのより倚くのAPIサヌフェス

属性を#[used(...)]ラップしお、それらを保持し、同時にホワむトリストに登録するこずを怜蚎したしたが、それはかなりばかげおいお、䞍安定すぎたす。

@alexcrichton

1぀の#[derive]属性が展開されおいるずき、それは将来のすべおの属性を䞞呑みしようずする可胜性がありたす

私はこの考えが奜きです。 #[cfg]ず#[cfg_attr]は#[derive]の前に凊理されるため、 #[cfg]保護された#[derive]はこのアプロヌチでは問題になりたせん。 たたは、属性ストリッピングの問題に察する@sfacklerの類䌌の解決策の堎合。

このアプロヌチでは、 @ sfacklerの゜リュヌションが少し単玔になりたす。これは、他の関連する掟生が最埌の属性にしか存圚しないためです @eddybの提案によっお物事が単玔化されるず思いたす。

コントロヌル属性の問題の1぀の可胜性は、syntexのhttps://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-codegen/src/libにいくぶん䌌おいる拡匵埌のコヌルバックを远加するこず

掟生implは独立しおいお、制埡属性を削陀するこずはできたせん。たた、クリヌンアップのためにすべおの展開が完了した埌に実行されるパスを登録できたす。

ディヌれルも手動でこれを回避しおいたす。 https://github.com/diesel-rs/diesel/blob/master/diesel_codegen/src/lib.rs#L101 -L112

@dtolnay耇数の#[derive]属性に関する以前の懞念は、 @ jseyfriedのおかげでたもなく修正されるはずです。

synずquoteパッケヌゞを䜿っおこれを詊しおみお、本圓に前向きな経隓をしたした。 これは、安定したずきに優れた機胜になりたす。

属性の問題は珟圚、 serdeの掟生ロゞックの䞋流にある私のimplを噛んでいたす。

掟生コヌドで未䜿甚の属性を無芖するか、通垞の掟生の埌に実行される遅い拡匵を蚱可しおそれらを削陀するこずは、私にずっお合理的な解決策のように思えたす。

マクロに元のトヌクンストリヌムを倉曎するオプションがない堎合は理想的です。これは、珟圚ずマクロ2.0の間で実際に䟝存される可胜性があり、埌で削陀するのが難しい危険な機胜のようです。

そのため、関数ゞェネリック内の型パスにセミコロンがありたせんでした。rustcから次の゚ラヌメッセヌゞが衚瀺されたした。 どの掟生マクロがlex゚ラヌを匕き起こしたか、どのトヌクンがそれを匕き起こしたかなど、より倚くの情報を提䟛できるかどうか疑問に思っおいたす。

error: custom derive attribute panicked
  --> src/simple.rs:69:1
   |
69 | struct C(u64);
   | ^^^^^^^^^^^^^^
   |
   = help: message: Failure parsing derived impl: LexError { _inner: () }

LexErrorのテストケヌスを䜜成したした。10月13日の倜に発生するようですrustupには曎新がありたせんでした https://github.com/keeperofdakeys/proc_macro_derive_test。

@ rust-lang / lang掟生物が泚釈付きアむテムを倉曎できるかどうかの問題に぀いお議論する必芁があるず思いたす。 それを可胜にするのは簡単な解決策ですが、ナヌザヌの期埅に反しおいるようで、かなり人気がないようです。 私はただ珟圚の解決策を奜みたす-シンプルさは玠晎らしく、提案された代替案のどれも私を非垞に優れおいるずは思いたせん。

アむテムを倉曎できる堎合は、属性を制埡するための゜リュヌションが必芁になりたす。 将来的に非掟生属性マクロが可胜である限り、掟生がアむテムを倉曎する機胜を維持するこずに぀いお、私は特に匷く感じおいるずは思いたせん。

誰かが「倉曎」を定矩する必芁がありたす。 構造䜓のメンバヌを倉曎するこずに぀いお話しおいるのですか、それずもコンパむラが未知の属性に぀いお文句を蚀うのを防ぐために属性を取り陀くこずに぀いお話しおいるだけですか

構造䜓のメンバヌを倉曎するこずに぀いお話しおいる堎合、私の意芋では、おそらく最善の解決策は、他のすべおの前に展開される各構造䜓で1぀の構造䜓倉曎マクロのみを蚱可するこずです。 それは明確に定矩され、私の意芋では期埅される振る舞いをするでしょう。

属性のストリッピングに぀いおのみ話しおいる堎合は、マクロの裁量に任せるのではなく、マクロメカニズム自䜓に属性を統合する方法があるはずです。

掟生がどのように動䜜するかに぀いおの私の盎感は、それがimplを远加するずいうこずです。 ゚ンドナヌザヌにずっお、derivesはimplsを远加し、他に䜕もしないように芋えるはずです。 特に、他の掟生物にずっお重芁な方法で構造䜓を倉曎するべきではないため、順序に䟝存しないようにする必芁がありたす。 これが掟生の動䜜方法であるこずに同意したすか、それずも掟生がアタッチされた型に察しお倉換を実行できる必芁があるず人々は考えたすか

これに同意するず、問題は次のようになりたす。公開するむンタヌフェむスでこれを匷制するのか、それずも䜜成者にこれを匷制するように任せるのか。 ここでは、2぀の盞反する問題があるようです。

  • 掟生の動䜜コントラクトを匷制するこずは、確かに私にはRust゜リュヌションのように思えたす。
  • serdeずdeiselをその制玄で機胜させるには、倚くの課題がありたす。

そしおもちろん、他の属性が構造䜓をどのように倉曎するかは、掟生の方法、具䜓的にはどのように動䜜するかずは無関係のようです。

泚釈付きアむテムを削陀する機胜により、珟圚のシステムが他の方法では果たせない倚くの圹割を果たすこずができるこずは泚目に倀したす。

@sgrifdeiselが

@withoutboatsその90はhttps://github.com/diesel-rs/diesel/blob/master/diesel/src/macros/macros_from_codegen.rs#L12-L18 。 それを超えお、入力トヌクンストリヌムの䜕かに觊れるのは、泚釈を取り陀くこずだけです。 https://github.com/diesel-rs/diesel/blob/master/diesel_codegen/src/lib.rs#L109 -L120

@sgrifたた、カスタム掟生を悪甚しお、手続き型のbangマクロを取埗したした。 個人的には、マクロ1.1に手続き型のバングマクロシステムがあり、この機胜を乱甚しすぎないようにするこずを匷く望んでいたす。 マクロに枡されたTokenStreamに存圚しないすべおの識別子が衛生状態で隠されおいるなど、手間がかかるが単玔な衛生状態の堎合は、ほが同じ手順のバングマクロストヌリヌを実行するこずも良い方法だず思いたす。それがどのように芋えるか正確にはわかりたせん、カスタム掟生を悪甚する代わりにそれを䜿甚しおから、カスタム掟生が存圚する構造䜓を倉曎できないようにしたす。 そうするこずで、さらに倚くのクレヌトを有効にし、UXを改善し、掟生を正気にするこずができたす。

ただし、deriveを単玔なマクロずしお保持するずいう議論は理解できたす。

私の芋解では、マクロ1.1の目暙は、可胜な限り倚くのニヌズを満たすために可胜な限り柔軟であり、メンテナンスの負担が少ないため、マクロ2.0たでの迅速な安定化ず䞀時的なギャップずしお機胜するこずができたす。 私の意芋では、珟圚の蚭蚈はその圹割に非垞によく適合しおいたす。

この圹割を恒久的に果たすこずを意図した䜕かに぀いお話しおいたら、私はそれに反察するでしょう

私は間違っおいるかもしれたせんが、RFCを読んだずころ、これは氞続的に掟生する動䜜の基瀎ずなるこずを目的ずしおいたす。 ぀たり、将来的にはさらに倚くのメ゜ッドがTokenStreamに远加されたすが、掟生マクロはこのAPIを䜿甚したす。これにより、珟圚、泚釈付きアむテムに察しお任意のミュヌテヌションを実行できたすこの機胜は、deiselのナヌスケヌスに必芁です。 。

デリバティブがこれを氞続的に実行できるようにするこずに぀いお、私はかなり吊定的に感じおいたす。 これが将来のある時点でmacro_rulesマクロずずもに非掚奚になるシステムであり、マクロ2.0では、より制限された別の掟生APIが優先されるこずを認める堎合、私はそれでより快適に。

デコレヌタを䜕でもできるトランスフォヌマヌずしおサポヌトする぀もりのようです。
そしお、属性に入力のない単玔なデコレヌタずしお公開された掟生。

@withoutboats serdeは、implの生成方法を倉曎するための倚くの属性をサポヌトしおいるため、凊理埌にそれらを削陀するか、無芖する機胜が絶察に必芁です。 それが圹に立ったら、自分たちでやりたいのではなく、削陀する必芁のある属性のリストをコンパむラヌに提䟛するこずができたす。

@eddyb私はデコレヌトが䜕でもできるこずに賛成ですが、長期的には

@ericktそうです。 長期的には、これらの属性を削陀するのは掟生者ではなく、no-opカスタム属性ずしお登録するのが理想的な解決策になるず思いたす。 しかし、それは短期的には実珟可胜ではありたせん。

長期的には、これらの属性を削陀するのは掟生者ではなく、no-opカスタム属性ずしお登録するのが理想的な解決策になるず思いたす。 しかし、それは短期的には実珟可胜ではありたせん。

私はこれを短期的に実行䞍可胜にするコンパむラの内郚に粟通しおいたせんが、カスタム掟生プラグむンが削陀する予定のカスタム属性のリストを衚瀺し、属性のその他の倉換を拒吊するこずは可胜でしょうかオリゞナルアむテム

たた、Dieselは、すべおのカスタム属性を1぀の名前で持぀ずいうSerdeのアプロヌチに埓わないこずにも気付きたしたたずえば、Dieselの#[table_name = "name"]ではなく#[serde(rename = "name")] 。単䞀のカスタム属性名だけの堎合、実装が簡玠化されたすかリストの代わりに登録されたしたか

コントロヌル属性の問題の1぀の可胜性は、syntexのhttps://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-codegen/src/libにいくぶん䌌おいる拡匵埌のコヌルバックを远加するこず

掟生implは独立しおいお、制埡属性を削陀するこずはできたせん。たた、クリヌンアップのためにすべおの展開が完了した埌に実行されるパスを登録できたす。

マクロ1.1の拡匵埌のコヌルバックをpost-expansionに実装したした。 掟生implは独立しおいお、コントロヌル属性を削陀するこずはできたせん。たた、属性を削陀するためにすべおの展開が行われた埌に実行されるパスを登録できたす。

本日、langチヌムミヌティングで倉曎/泚文の問題に぀いお話し合いたした。 ナヌザヌの期埅に応え、単玔にするために蚭蚈の芳点から、䞊に重ねられたハックが倚すぎず、解読/デバッグ゚ラヌの圱響を受けにくいずいう芁望がありたした。 タヌゲットデヌタの倉曎は驚くべきものですが、安党ではないこずに泚意しおください。 たた、やる気のある理由ではなく、それ自䜓のために玔粋になりがちであるず感じられたした。

結局、゜ヌスを倉曎しない掟生物の方がおそらく優れおいるず刀断し、そのモデルに倉曎する必芁がありたす。 それはFCP期間を延長するこずを意味するかもしれたせん。 ストリッピング属性を凊理するための特別なメカニズムがあるべきだずは思いたせんでした。 むしろ、コンパむラが属性を凊理する方法は、マクロによっお䜿甚される属性がプログラムに残るこずを可胜にする必芁がありたす。 RFC 1755は、これを考慮に入れる必芁がありたす。

これにより、䞀郚のカスタム掟生ナヌザヌの安定化が遅れたす。 ただし、掟生のほずんどの䜿甚特にナヌザヌを安定したツヌルチェヌンから遠ざけるものは属性を䜿甚しないため、たずえば、Serdeのほずんどのナヌザヌはすぐに安定に移行できるようになりたす。 属性が必芁なものは、数サむクル長くかかりたすが、䞀般的なケヌスには圱響したせん。

cc @ alexcrichton 、 @ dtolnay 、 @ sgrif 、 @ erickt-考え

属性は、おそらくあなたが提案するよりもSerdeずDieselでより䞀般的に䜿甚されたす。 私自身の経隓から、Serdeを䜿甚するすべおのプログラムが属性を䜿甚しおいるず確信しおいたす。 Dieselでは、間違いなく属性を䜿甚したす。どのデヌタベヌステヌブルが構造䜓にマップされおいるかをdiesel_codegenに䌝えるために必芁だず思いたす。

そうは蚀っおも、カスタム掟生に構造䜓を倉曎させないこずは、私にずっお正しい遞択のように思えたす。 それは党䜓を単玔化するだけで、倚くの奇劙な゚ッゞケヌスを防ぎたす。 すばやく実行するよりも正しく実行するこずが重芁です。そのため、機胜をもう少し䞍安定な状態に保぀必芁がある堎合は、それでも問題ないようです。

タヌゲットデヌタの倉曎は驚くべきものですが、安党ではないこずに泚意しおください。

安党でない特性を導き出さない限り、それは安党ではありたせん。

私の意芋では、カスタム掟生のナヌスケヌスの1぀は、安党でないずマヌクされた特性を安党な方法で実装するこずです。たずえば、実装される構造䜓のメンバヌのレむアりトを正確に蚘述しなければならない特性などです。

私のasn1クレヌトには、些现な䜿甚法以倖の属性も必芁なので、カスタム属性が着地するたで効果的に埅぀必芁がありたす。

カスタム属性rfcを2぀に分割するのは良い考えですか

  1. 䞀般にカスタム属性の衚蚘法ず名前空間を提䟛するrfc安定版でno-op属性を蚱可。
  2. 定矩方法のRFC、およびカスタム属性マクロの実行に関するセマンティクス。

カスタム属性マクロは、肉付けする堎合に倚くのこずを必芁ずするもののように芋えたす。 したがっお、rfcを2぀に分割するず、カスタム掟生パッケヌゞの安定した属性がより早く提䟛される可胜性がありたす。

これは、属性が名前空間であり、意図的であるこずも意味したす぀たり、クレヌトの属性を䜿甚するには、倖郚クレヌトが必芁です。 これは、同じ属性名を䜿甚する2぀のカスタム掟生マクロを防ぐための良い方法であるず予枬できたす。 ここでの良い期埅は、属性に特性が含たれおいるクレヌトの名前を䜿甚するこずです。

この実装が通垞のname!マクロを含たない理由はありたすか 通垞のマクロの単玔なTokenStream 、 TokenStream出力は、耇雑な文法のコンパむル時間が30秒を超える害虫に非垞に圹立ちたす。

@dragostis rfcの芁玄を匕甚するには

コンパむラで今日の手続き型マクロシステムの非垞に小さな断片を抜出したす。これは、カスタム掟生機胜などの基本機胜を取埗するのに十分であり、最終的には安定したAPIになりたす。 これらの機胜がコンパむラにメンテナンスの負担をかけないようにするだけでなく、同時に「完璧なマクロシステム」に十分な機胜を提䟛しようずしないでください。 党䜓ずしお、これは公匏の「マクロ2.0」に向けた段階的なステップず芋なす必芁がありたす。

たたは、より実際的な甚語では、珟圚構築しおいるクロヌゞャヌシステムず同じように、適切に機胜する手続き型マクロシステムを取埗するには、倚くの蚭蚈ずテストが必芁になりたす。 serdeやdieselようなクレヌトには、適切なカスタム掟生機胜がないために深刻なナヌザビリティの問題があるため、今すぐ修正するための䞀時的な察策を講じたしょう。手続き型マクロシステム。 synずquote箱は、この良い䟋です。

@keeperofdakeysうん、わかった。 私はマクロ2.0の実装を求めおいるのではなく、別の属性を远加するための負担があるかどうか疑問に思っおいたす。たずえば、通垞のマクロの掟生蚭蚈のみを反映する最小限の実装であるproc_macroです。 害虫の䟋では、 structパヌサヌを単玔に導出したすが、 struct自䜓からは導出せず、 {}間で定矩された単玔な文法から導出したす。 しかし、私は死んだ議論を掘り䞋げおいないこずを願っおいたす

@dragostis私は少し前に内郚でこの可胜性を持ち出したした。 あなたはそこで応答を読むこずができたす https 

@nrc

たた、やる気のある理由よりも、それ自䜓のために玔粋さを求める傟向があるのではないかず感じたした。

これに関する1぀の泚意パラメトリシティや専門化などの難しい決定を䞋さなければならなかった倚くの堎合、「玔床」の関連する抂念を静的に保蚌するこずは困難/䞍可胜です。 しかし、この堎合、構造によっおそれを保蚌するこずは実際には非垞に簡単であり、掟生の順序の重芁性を排陀するこずは、ナヌザヌにずっおかなり匷力な単玔化のように思えたす。

安定性に関しおは、属性を無芖するための䞍安定なメカニズムを远加するこずを怜蚎できたす。これは、倜間に䜿甚する必芁がある堎合でも、実際には安定しおいたすAPIが砎損する傟向がないずいう点で。 このようなサむドチャネルの安定化を怜蚎するこずもできたす。利甚可胜になったら、より䞀般的なメカニズムを優先しお非掚奚にする予定です。 たたは、 @ keeperofdakeysの提案を怜蚎しお、圓面の懞念に察凊する䞀般的な属性゜リュヌションの䞀郚をすばやくプッシュするこずもできたす。

私の芋解では、これらの懞念のいずれも、マクロ1.1がSerdeで広く䜿甚可胜であり、少なくずも「事実䞊」安定しおいる぀たり、壊れおいないこずを倧幅に劚げないこずが重芁です。

@sgrif

この圹割を恒久的に果たすこずを意図した䜕かに぀いお話しおいたら、私はそれに反察するでしょう

@withoutboatsを゚コヌし​​、珟圚の意図は、マクロ2.0を出荷する堎合でもマクロ思いたした。 ただし、これは再考できるこずです。最終的なシステムが導入されたら非掚奚にするこずを目的ずしお、今日のmacro_rulesのように考えるこずができたす。

カスタム掟生での属性の䜿甚に関する私の印象は、 @ jimmycuadraの印象に䌌おいたした。぀たり、それらはかなり䞀般的に䜿甚されおいたす。 私は、カスタム属性が倚くのディヌれルのナヌスケヌスにずっお重芁であるず信じおいたすしかし、私が間違っおいる堎合は蚂正しおください。

その意味で、私はそれらの属性に぀いお前進するための最良の方法が䜕であるかを100確信しおいたせん。 マクロ1.1を安定させるのは恥ずべきこずですが、そもそもマクロ1.1をすばやく安定させるずいう目的をやや損なうため、たずえそれが毎晩「事実䞊安定しおいる」ずしおも倚くのナヌザヌを毎晩残したす。 蚀い換えれば、マクロ1.1ナヌザヌの倧倚数を_実際に_安定したRustに匕き蟌たないのであれば、マクロ1.1を安定させるのは埅぀こずができるず思いたす。

しかし、私を悩たせおきた1぀のポむントは、カスタム属性が長期的にどのように芋えるか、そしお珟圚のマクロ1.1システムでそれを合理化するず私たちが考えるこずです。 カスタム属性の珟圚のRFCでは、クレヌトはクレヌトの䞊郚に属性のホワむトリストに登録された名前空間を宣蚀する必芁がありたす。 ぀たり、カスタム掟生でカスタム属性を䜿甚するこずは、他の堎所でカスタム属性を䜿甚するこずずは根本的に異なりたす。 その切断は、人間工孊的で「驚き最小の」芳点から私を心配したすが、RFCを埮調敎するための匷制機胜ずしおも芋おいたすたずえば、 serdeクレヌトにリンクするず、serde属性を自動的にホワむトリストに登録できる可胜性がありたす。

党䜓ずしお、今日のマクロ1.1システムを完党に安定化させお、個人的には順調に進んでいたす。 ぀たり、カスタム掟生展開関数が構造䜓を受け取り、それを保持したい堎合は構造䜓も返す必芁があるずいう事実を安定させたす。

私はrustc-serializeからserdeに切り替える傟向がありたす。serdeのコヌド生成は制埡属性をサポヌトしおいるからです。

マクロ1.1を拡匵しお、掟生属性自䜓ぞの匕数をサポヌトするこずができたす。 これは䞀般的には良いこずのように思われ、短期的には制埡属性の欠劂を回避するために悪甚される可胜性がありたす。

同䞊@jimmycuadraず@sfackler 、属性は@nrcのコメントがそれらを健党にするよりも

ここでの正しい動きに぀いおはただ意芋がありたせんが、属性なしで安定した堎合は、ドキュメントコメントを解析しお属性を匕き出すこずを匷く怜蚎するこずを知っおいたす。 倚くの人は、次のように曞くためだけにビルドスクリプトを扱いたくないず思いたす。

#[serde(skip_serializing)]

.. の代わりに

/// <!-- serde(skip_serializing) -->

@tomaka

私の意芋では、カスタム掟生のナヌスケヌスの1぀は、安党でないずマヌクされた特性を安党な方法で実装するこずです。たずえば、実装される構造䜓のメンバヌのレむアりトを正確に蚘述しなければならない特性などです。

この点で、私のコメントに぀いおどう思いたすか 満足のいくパタヌンであるこずがわかりたした。

私は䞀぀のこずを明確にしたい

カスタム属性を削陀するこずは、人々がカスタム掟生で行う䞻なこずですか

私が行うには、いく぀かのハッキングがいるこずを知っおいるfoo!これらのナヌスケヌスはどのように䞭倮-タむプのコンテキストで拡倧䟋えば、@sgrifはディヌれルで、このようなナヌスケヌスを述べ、私は@tomakaがあたりにも1に述べたず思いたす 

私が尋ねる理由はこれです掟生メカニズムがadd'limplsのリストだけを返すようにするこずの利点がわかりたす。 特に、型宣蚀自䜓のスパンが正しいこずを意味したす。 そのタむプのコンテキストでホワむトリストに属性名のリストを提䟛できるようにする、手っ取り早いAPIをコンテキストに远加するこずは、属性を修正するのに十分簡単なようであり、い぀でも非掚奚にするこずができたす。

ただし、より倚くのナヌスケヌスを有効にしたい堎合率盎に蚀っお、これらのナヌスケヌスはもう少し...驚くべきこずですが、掟生から䜕を期埅するかを考えるず、これは機胜したせん。 その堎合、私はおそらくそのたた安定させ、掟生を曞くためのより良い方法を支持するために「生のバむトから」APIを非掚奚にするこずを蚈画しおいるず思いたす結局のずころ、私たちは人々がそうなるこずを本圓に期埅しおいたせ

@nikomatsakis䞻な必芁性は、属性を削陀するのではなく、無芖するこずです。 私はそれらを無芖するこずの深刻な欠点を認識しおいたせん。 たずえば、main属性ぞの远加パラメヌタを介しお掟生関数のホワむトリストを提䟛するこずは、手続き型マクロハックではなく真の掟生であるすべおの実際的なニヌズに十分なはずです。

ええ、私はこれに関する2぀のアプロヌチの間で匕き裂かれおいたすが、どちらにも明らかな欠点がありたす。

  1. 「単玔な掟生」アプロヌチ-远加のアむテムのみを生成するようにAPIを調敎し、ナヌザヌが掟生の䞀郚ずしおカスタム属性を䜿甚するこずを䞍安定にし、ディヌれルや他のクレヌトがゞャンプしお任意の手続き型マクロを取埗する穎を閉じたす。
  2. 「蚈画的陳腐化」アプロヌチ-APIをそのたた安定させ、Nikoが呜名に぀いお述べたように、い぀か非掚奚にするこずを意図しお、わずかな調敎を加えたす。 これには、すべおのカスタム掟生䜜成者がい぀かコヌドを曞き盎す必芁があり、暫定期間䞭に予期しない動䜜が発生する可胜性がありたす。

線集しかし、 @ eddybのホワむトリストも有望に聞こえたす。

@nrcがIIRCはナヌザヌクレヌトのホワむトリストに぀いお話しおいるが䜕か違うものを提案しおいる

rust-cppでmacros1.1システムを悪甚しおきた任意の手続き型マクロは、implを远加しお属性を無芖する機胜を提䟛する別のアプロヌチで完党に可胜になりたす。

属性を無芖する機胜は䞍可欠だず思いたすが、それ以倖は、それを超えお構造䜓を倉曎できなくおも問題ありたせん。

@sgrifが

@sfacklerによっお提案されおいるように、カスタム掟生に匕数を取るこずを蚱可するこずは、カスタム属性に関する決定を延期できるようにしながら、必芁な機胜をすべおの人に提䟛する方法かもしれたせん。 芋栄えも読みやすさも劣りたすが、仕事は終わりたす。 䟋えば

#[derive(Debug, Clone, Serialize(field("bar", rename = "baz")))]
pub struct Foo {
  pub bar: String,
}

このフォヌムは、カスタム属性に関する決定が䞋されるず、埌で非掚奚になり、カスタム属性を優先する可胜性がありたす。

Serdeず私のクレヌトの䞡方にフィヌ​​ルド/バリアント属性が必芁です。 掟生匕数を䜿甚しおこれを゚ミュレヌトしようずしおも意味がありたせん。属性が必芁です。

これを安定させるためにどのような決定を䞋しおも、マクロ2.0掟生APIに切り替えるずきに、カスタム掟生マクロのナヌザヌがコヌドを倉曎する必芁がない堎合は䟿利です明らかに、カスタム掟生マクロの䜜成者は倉曎したす。 最も賢明な決定は、掟生のために削陀する属性のリストをコンパむラヌに提䟛するこずであるように思われたす。重芁なこずに、それらは_all_掟生マクロが実行された埌にのみ削陀されたす。 Serde、ディヌれル、および私のクレヌトはすべお、耇数の掟生マクロに察しお同じ属性を必芁ずするずいう問題がありたす。

ストリッピング動䜜を䜿甚するず、 @ dtolnayが別の掟生マクロを远加しお、残りの実行埌に属性をストリッピングするために䜜成した拡匵埌のクレヌトは必芁ありたせん。

FWIWこれらの属性を削陀する唯䞀の理由は、HIRをスリムに保぀こずです。他のすべおに関する限り、䜿甚枈みずしおマヌクするだけで枈みたす。

カスタム属性を削陀するこずは、人々がカスタム掟生で行う䞻なこずですか

私はfooを行うためのいく぀かのハックがあるこずを知っおいたす タむプの文脈で拡倧䟋えば、@sgrifはディヌれルで、このようなナヌスケヌスを述べたように、私は@tomakaがあたりにも1に蚀及したず思う -これらのナヌスケヌスは、どのように䞭倮ですか

カスタム掟生は構造䜓を倉曎できないずいう事実に私は完党に倧䞈倫です。

安定したRustにプラグむンがないこずに぀いお䞍平を蚀うこずがよくあるので、カスタム掟生物を芋たずき、プラグむンを持぀機䌚ずしおそれらを䜿甚したした。 しかし、私は明らかに、カスタム掟生物がそれらが蚭蚈されおいないものをサポヌトしなければならないず䞻匵する぀もりはありたせん。

最近の毎晩に回垰があるようです。 ゚ラヌが発生する

Queryableは掟生モヌドです

䟋をコンパむルするずき。

#[derive(Queryable)]
pub struct Post {
    pub id: i32,
    pub title: String,
    pub body: String,
    pub published: bool,
}

@sgrifこれは、他のマクロず同じ名前空間を䜿甚するようにカスタム掟生を倉曎した37198が原因bang!()  #[attribute]マクロ、および#[derive(custom)]マクロがすべお共有されるように同じ名前空間。

この䟋では、 #[macro_use] extern crate diesel;はQueryableずいう名前のbangマクロをむンポヌトし、 #[macro_use] extern crate diesel_codegen;はQueryableずいう名前のカスタム掟生マクロをむンポヌトしたす。これはbangマクロをサむレントに䞊曞きしたす - #[macro_use]サむレント䞊曞きは理想的ではありたせんが、 use代わりに#[macro_use] use䜿甚しお倖郚クレヌトからマクロをむンポヌトできれば、問題にはなりたせん。

この゚ラヌは、カスタム掟生の展開でのbangマクロの呌び出しQueryable!();が原因であるず考えられたす。これは、 dieselからのbangマクロではなく、 diesel_codegenからのカスタム掟生に解決されたす。

@jseyfried 3぀の「皮類」のマクロすべおに単䞀の名前空間を䜿甚する理由は䜕ですか 関数ず型を同じ名前空間を占めるものずしお扱うこずは理にかなっおいる以䞊に、属性ずbangマクロを同じ名前空間を占めるものずしお扱うこずは私には意味がないようですマクロの掟生はさらに少なくなりたす。

@withoutboatsこれは間違った䟋えだず思いたす。さたざたな皮類のマクロが、さたざたな皮類の倀や型関数や定数などず同じように名前空間を共有しおいるず思いたす。 名前空間を持぀こずには耇雑なコストがかかり、私は私たちが持っおいる方が良いず信じおいるので、問題はなぜ異なる名前空間が必芁なのかずいうこずです。 明らかに、逆互換の堎合、マクロは関数や型ずは異なる名前空間にある必芁がありたす。

本圓の問題は、 useを䜿甚しお、マクロを遞択的にむンポヌトしたり、名前を倉曎したりできないこずです。 したがっお、クレヌトナヌザヌには、マクロ名の衝突を回避する機胜がありたせん。 同時に、ProcMacroクレヌトをむンポヌトしおロヌカルマクロ名ず衝突するこずは期埅しおいたせん-掟生マクロはderive_始たっおいるず思いたしたか

名前空間を持぀こずには耇雑なコストがかかり、私は私たちが持っおいる方が良いず信じおいるので、問題はなぜ異なる名前空間が必芁なのかずいうこずです。

アむテムは、互いにあいたいになる可胜性がある堎合にのみ名前空間を共有する必芁があるず思いたす。 constsずfnsは、どちらも匏コンテキストでIDずしお䜿甚されるため、同じ名前空間にありたす。 トレむトオブゞェクトの構文のため、タむプずトレむトは同じ名前空間にありたす。

これらの3皮類のマクロは、すべお異なる方法で呌び出されたす。 呌び出しにあいたいさが生じるこずは決しおないため、名前空間を共有する必芁があるこずは私には意味がありたせん。

実装の耇雑さにはコストがかかりたすが、これらを別々に名前空間化するこずによっお、耇雑さを_䜿甚_するこずに倧きなコストはないず思いたす。 蚀語機胜の耇雑さのコストに぀いお考えるずき、私は通垞、䜿甚の耇雑さに぀いお考えたす。


重倧な倉曎ではない堎合、_すべおの_アむテムは同じ名前空間にある必芁があるず思いたすか あなたの思考プロセスに぀いお明確にしようずしおいたす。

もう少し考えおみるず、すべおのアむテムが含たれる名前空間は1぀だけである必芁があるず蚀っおも問題ありたせん。 「実際のコンストラクタヌ」パタヌン党䜓はIMOを少し混乱させたすが、それはRustが非マクロアむテムに察しお行った決定ではないため、マクロアむテムが異なる名前空間を占める方が䞀貫性があり、期埅されるようです。

本圓の問題は、useを䜿甚しおマクロを遞択的にむンポヌトしたり名前を倉曎したりできないこずです。

マクロ2.0でできるようになりたす。 ここでのモデルは基本的に䞀時的なハックです。

掟生マクロはderive_で始たっおいるず思いたしたか

それは叀いカスタム掟生システムでした。マクロ1.1がこれを行うずは思いたせん。

実装の耇雑さにはコストがかかりたすが、䜿甚の耇雑さには倧きなコストはないず思いたす

䜿甚の定矩にはコストがかかりたす。特に、ツヌルの䜿甚が難しくなりたすあたり議論しないかもしれたせんが。 たた、蚀語の耇雑さほど重芁なのは実装の耇雑さではないず思いたす名前空間はコンパむラを耇雑にしたすが、これはそれほど重芁ではないこずに同意したす-ナヌザヌはRustを䜿甚するためにこのこずに぀いお掚論する必芁があり、ノックオンがありたす衛生やシャドりむングなどに圱響を䞎え、事態をさらに耇雑にしたす。

重倧な倉曎ではない堎合、すべおのアむテムが同じ名前空間にある必芁があるず思いたすか あなたの思考プロセスに぀いお明確にしようずしおいたす。

それほど遠くたでは行きたせん-倀ず型を分離するこずには利点があるず思いたすが、確かに、単䞀の名前空間を持぀蚀語は、倚くの方法で操䜜する方がはるかに優れおいたす。

しかし、それはRustが非マクロアむテムに察しお行った決定ではありたせん

察䜍法モゞュヌルずフィヌルドは倀の名前空間にありたすが、それらを䜿甚できる堎所は私が思うに他の倀を䜿甚できる堎所ずは異なりたす。

@keeperofdakeys

本圓の問題は、 useを䜿甚しお、マクロを遞択的にむンポヌトしたり、名前を倉曎したりできないこずです。

すぐに〜1週間機胜ゲヌトの埌ろでextern crateからuseマクロを実行できるようになりたす。https//github.com/rust-lang/rfcs/pull/1561を参照しおuse ingマクロを、カスタム掟生自䜓ずずもに安定化するこずを決定する堎合がありたす。

掟生マクロはderive_始たるず思いたした

これは、叀いスタむルのカスタム掟生に圓おはたりたした。 マクロ1.1のカスタム掟生では、 #[derive(Serialize)] たずえばはSerializeがカスタム掟生マクロに解決されるこずを期埅したす。

@withoutboats

3぀の「皮類」のマクロすべおに単䞀の名前空間を䜿甚する理由は䜕ですか

  • 優先順䜍bangマクロず属性マクロは長い間名前空間を共有しおきたので、その倉曎が行われるたで、カスタム掟生物もその名前空間を共有する必芁があるず思いたす。
  • 䞋䜍互換性単䞀のマクロ名前空間から開始する堎合、互換性を持っお䞋䜍に分割できたす。 耇数のマクロ名前空間から始めるず、氞遠にそれらに固執したす。
  • シンプルさ各マクロの「皮類」に独自の名前空間がある堎合、合蚈5぀の名前空間がありたす。 したがっお、 https//github.com/rust-lang/rfcs/pull/1561が着陞した埌、 use foo::bar;はbar 倀、タむプ、バングマクロずいう名前の_5぀の個別のアむテム_をむンポヌトできたす。など、たずえば、bangマクロを再゚クスポヌトするが、カスタム掟生マクロは再゚クスポヌトしない、たたはカスタム掟生マクロをbazずしおむンポヌトする簡単な方法はありたせん。

䞋䜍互換性単䞀のマクロ名前空間から開始する堎合、互換性を持っお䞋䜍に分割できたす。 耇数のマクロ名前空間から始めるず、氞遠にそれらに固執したす。

これは、特に1.1が䞀時的なギャップであるず想定されおいるため、説埗力がありたす。 +1

これは、たずえばPartialEq!ずいうmacro_rulesマクロを持っおいる人のコヌドを壊したすか

いいえ、 PartialEqはカスタム掟生ではないため、今日のマクロ名前空間では定矩されおいたせん。
#[derive(Foo)]は、カスタム掟生Foo探す前に、たずFooが「組み蟌み掟生」 PartialEq 、 Copyなどであるかどうかを確認したす。マクロ名前空間のFoo 。 ビルトむンはderiveの定矩にハヌドコヌドされおいたす。

そうは蚀っおも、最終的にPartialEq組み蟌みではなくプレリュヌドのカスタム掟生にするこずにした堎合、あなたが説明したようにコヌドを壊す可胜性があるので、今のずころそれを将来蚌明するのは良い考えかもしれたせん。

属性の問題の提案掟生マクロが宣蚀されおいるアむテムを倉曎できず、装食するだけのモデルで䜜業しおいるず仮定

  • 舞台裏では、カスタム掟生マクロは、珟圚MultiItemModifier特性を実装しおいたす。 マクロ2.0が匕き続き特性を実装し、この特性がメカニズムの拡匵性のために䜿甚されるこずが蚈画です。 マクロである泚釈付き関数は、この特性を実装したす。 プラグむンレゞストラは䜿甚したせんが、これは本質的に脱糖です。
  • 特にマクロ1.1カスタム掟生のためにCustomDerive特性を分割する必芁がありたす。 䞀般的なケヌスでは、マクロの䜜成者はそれを芋るこずはありたせん。 ただし、関数で属性を䜿甚するのではなく、トレむトを盎接実装するオプションがありたすimplで属性を再利甚するこずを期埅しおいたす。おそらく、この登録メカニズムに぀いお説明する必芁がありたす。
  • 我々は、远加declare_attributesに関数をCustomDerive返すVec<String> 。 空のvecを返すデフォルトのimplがありたす。
  • マクロの䜜成者がこのメ゜ッドを実装する堎合、返された文字列の1぀ずたったく同じ名前の属性は、マクロに属しおいるず芋なされたす。 このような属性はマクロのように怜玢されるこずはなく、カスタム属性のlintをトリガヌしたせん。 属性は掟生展開によっおコヌドに残されたすが、䜿甚枈みずしおマヌクされたす。 掟生展開によっお倉曎されないそのような属性は、未䜿甚の属性lintをトリガヌしたすカスタム属性lintはトリガヌしたせん。
  • 将来的には、カスタム掟生を含むマクロが䜿甚できるスコヌプ属性を導入する可胜性がありたす。これらはdeclare_attributes _远加_され、このメカニズムは非掚奚になりたせん。
  • 代替方法 declare_attributesによっお返される文字列は、属性のパスプレフィックスずしおチェックされたす。たずえば、 declare_attributesがvec!["foo::bar"]返した堎合、 #[foo::bar::baz]ず#[foo::bar::qux]は蚱可されたす。

考え cc @alexcrichton @jseyfried @dtolnay @sgrif @erickt @ rust-lang / lang

@nrcは、そのメカニズムにより、 #[cfg(..)]などの_used_属性を偶然たたは故意に無効にするこずができたすか そしお、それは倉曎できたすか

@nrc残念ながら、これらの制玄があるず実装がどのようになるかはよくわかりたせん。そのため、それが機胜するかどうかは完党にはわかりたせん。

そうは蚀っおも、トレむトのむンスタンスはどこで䜜成されおいるので、トレむトずトレむトオブゞェクトが機胜するかどうかに぀いおは少し懐疑的です。

@nrcなぜこれが必須であり、derivw゚クスパンダ関数を指定する属性のリストにするこずができないのですか 䟋 #[proc_macro_derive(Serialize, uses_attrs(serde_foo, serde_bar))]など。

@ collin-kiegel掟生アプリケヌションのスコヌプにのみ適甚できるず思いたす。その堎合、マクロ展開の前にcfgを適甚する可胜性があるず思いたすが、他の属性を無効にするこずはおそらく予想される動䜜ですこれは倉曎されたしたが、芚えおいたせん前ず埌。

@alexcrichton

そうは蚀っおも、トレむトのむンスタンスはどこで䜜成されおいるので、トレむトずトレむトオブゞェクトが機胜するかどうかに぀いおは少し懐疑的です。

うヌん、良い点です。マクロ2.0ではこれに察凊する必芁があるず思いたす。

@eddybこれは良い考えであり、おそらく短期的には簡単です。 呜什型アプロヌチを奜む私の理由は、それが䞀般的な拡匵メカニズムであり、維持したいものであるのに察し、属性に物事を远加するこずはあたりうたくスケヌリングせず、氞遠に固執したいものではないかもしれないからです。 䞀方で、今は確かに簡単で、ぶらぶらしおいるのは悪いこずではないように思われるので、もっず良い賭けかもしれないず思いたす。

巻き蟌たれお-私は囜倖に出お、その埌病気になりたした。 すべおの皮類のマクロが同じ名前空間を占めるこずは意味がないず思うので、 https//github.com/rust-lang/rust/pull/37198に再床derive_Fooなどの名前空間にあるこずを期埅したす。 暙準ラむブラリでも同じ名前を䜿甚する耇数のタむプのマクロのナヌスケヌスがありたす䟋 #[cfg]およびcfg! 

たた、共有名前空間は少し厄介だず思いたす。 ゚ンドナヌザヌの芳点からは、ある皮の互換性、あいたいさ、たたは䜕か面癜いこずが起こっおいるように芋えるかもしれたせんが、そうではありたせん。 このような「ランダムな」制限により、Rustを蚀語ずしお理解するのが少し難しくなる可胜性があるず思いたす。

しかし、それはおそらく䞖界の終わりではないず思いたす。 将来的には、倚くのこずを壊すこずなく、さたざたな名前空間が導入される可胜性があるようです。

@sgrif @ collin-kiegel https://github.com/rust-lang/rust/issues/35900#issuecomment-256247659で単䞀のマクロ名前空間の理論的根拠を説明したした。

すべおの皮類のマクロが同じ名前空間を占めるこずは意味がないず思いたす

明確にするために、bangマクロず属性マクロは垞に同じ名前空間を占めおきたした。 37198カスタム掟生をこの名前空間に移動したした。

暙準ラむブラリでも同じ名前を䜿甚する耇数のタむプのマクロのナヌスケヌスがありたす䟋 #[cfg]およびcfg! 

あるいは、 cfgは、bang呌び出したたは属性呌び出しを介しお䜿甚できる単䞀のマクロず芋なすこずができたす珟圚、ナヌザヌがbangたたは属性を介しお呌び出すこずができるマクロを定矩するこずはできたせんが、マクロ2.0で蚱可するこずを決定するかもしれたせん。

゚ンドナヌザヌの芳点からは、ある皮の互換性があるように芋えるかもしれたせん

これは、2぀のマクロが競合する堎合に、明確な゚ラヌメッセヌゞで改善できるず思いたす今日のメッセヌゞの改善に取り組みたす。

将来的には、倚くのこずを壊すこずなく、さたざたな名前空間を導入できるようです。

マクロ名前空間の分割は完党に䞋䜍互換性があるず思いたす間違っおいる堎合は蚂正しおください。 これが、今日単䞀のマクロ名前空間を維持するための私の䞻な動機です。マクロ1.1に可胜な限り将来の互換性を持たせたいず考えおいたす。

最埌に、bang /属性マクロずカスタム掟生マクロの競合は実際にはたれだず思いたす。これは、bang /属性マクロは通垞小文字であり、カスタム掟生は通垞倧文字であるためです。 蚀い換えるず、これらの呜名芏則に埓っおいる堎合、カスタム掟生にはすでに独自の名前空間がありたす。

砎損https://github.com/diesel-rs/diesel/issues/485は、 Queryable! { struct S; }や#[derive(Queryable)] struct S;サポヌトが原因のようです。 カスタム掟生が安定したら、 Queryable! { struct S; }をサポヌトする必芁がなくなるので、これは問題ではなくなりたすよね

それたでの間、 diesel曎新しお、

  • Queryable!は、 #[macro_use] extern crate diesel_codegen;なくおも匕き続きサポヌトされ、
  • #[derive(Queryable)]は、 Queryable!ではなく、 #[macro_use] extern crate diesel_codegen;サポヌトされおいたす。

気軜にIRCで私にpingしお話し合っおください。PRを曞いおいただければ幞いです。

@nrc @alexcrichton

そうは蚀っおも、トレむトのむンスタンスはどこで䜜成されおいるので、トレむトずトレむトオブゞェクトが機胜するかどうかに぀いおは少し懐疑的です。

@eddybに同意したす。属性を凊理する芳点から、属性を拡匵するだけで枈みたす。

しかし、より柔軟な拡匵システムが必芁な堎合は、トレむトを䜿甚するこずを想像しおいたしたが、これらのトレむトは、 Self参照しないメ゜ッドのコレクションずしお定矩されたす。

trait CustomDerive {
     fn foo(); // note: no self
     fn bar(); // again, no self
}

次に、それをstruct my_annotation_type;ようなダミヌタむプ属性ず同じ名前を共有しおいるず思いたすかに実装し、トレむト解決を䜿甚しお<my_annotation as CustomDerive>::fooような関連関数を抜出したすおそらくメタデヌタを曞き出すずき、私は掚枬したす。 重芁なのは、 my_annotationむンスタンスを䜜成するたたは必芁ずするこずは決しおないずいうこずです。これは、関連する関数の束をたずめるための単なるグルヌプ化メカニズムです。

確かにこれたでで最も゚レガントなものではありたせんが、より良い方法がわかりたせんか ゚レガンスが、属性関数から始めたかった理由だず思いたす。 =

名前空間に関しおは、 @ sgrifは#[cfg]ずcfg!䟋で良い䟋を瀺しおいたす。 私は確かに#[derive(SomeTrait)]を望んでいお、 SomeTrait! { ... }ような...䜕かをするマクロを持っおいるこずを想像するこずができたす。 =しかし、 @ jseyfriedは、_すでに_制限に達しおいない限り、䞋䜍互換性の良いケヌスにもなりたす。

私はデフォルトでより少ない名前空間を奜む傟向がありたす。これは䞻に、倀/型の名前空間を分割するこずで私たちが苊痛を感じるためです。 そうは蚀っおも、既知の問題点のほずんどはここには圓おはたらないず思いたす。

  • use foo::barはbarずいう名前のモゞュヌルをむンポヌトする堎合ずしない堎合があり、したがっおbar::bazような名前解決に関連するたたは関連しない可胜性があるため、タむプ/倀の分割は名前解決の苊痛です。
  • 型/倀の分割は、定数よりもゞェネリックスにずっお䞀皮の苊痛ですが、その苊痛は、型ず倀の間の構文䞊の分割も原因です。

しかし、倧䜓においお、私たちは橋を枡ったので、「カスタム掟生」をそれ自身の名前空間に䜏たわせるこずが特定の挑戊をもたらすかどうかはわかりたせんね

生成されたマクロにderive_プレフィックスを远加しお、それらを疑䌌名前空間にするこずができたす。 その倉曎を加えたいのであれば、今がその時です。

@keeperofdakeysこれは、カスタムderive_*ずいう名前を付けるこずを決定したカスタム掟生物の䜜成者ず同等ではないでしょうか。 ずにかく、 derive_*名前ぱンドナヌザヌにずっお醜すぎるず思いたす。

@nikomatsakis

しかし、倧䜓においお、私たちは橋を枡ったので、「カスタム掟生」をそれ自身の名前空間に䜏たわせるこずが特定の挑戊をもたらすかどうかはわかりたせんね

むンポヌト解決アルゎリズムは、任意の数の名前空間を凊理できたすが、名前空間ごずに重芁な量の䜜業を実行する可胜性がありたす。 特に、むンポヌトIず未䜿甚の名前空間Sごずに、解決策IがS倱敗するこずが蚌明されたすhttps// githubを参照。 com / rust-lang / rfcs / pull / 1560issuecomment-209119266。 この蚌明では、関連する䞍確定なむンポヌトを怜玢するために、グロブむンポヌトグラフ頂点がモゞュヌルで゚ッゞがグロブむンポヌトのDFSが必芁になるこずがよくありたす。

ただし、この䜙分な名前空間ごずの䜜業は実際には違いがない可胜性があり、必芁に応じお回避できたすhttps://github.com/rust-lang/rfcs/pull/1560#issuecomment-209119266を参照。マクロ名前空間にのみ適甚されるマむナヌな制限。

37198で名前空間をマヌゞしお、ほずんどの堎合オプションを開いたたたにしたした。実際には制限されるずは思わなかったためです。 人々が今日それを望んでいお、@ rust-lang / langが氞遠に耇数のマクロ名前空間を持っおいおも倧䞈倫なら、私は異議はありたせん。

@nikomatsakis

䞍思議なこずに、あなたの戊略はうたくいくず思いたす。 私の個人的な感芚は、奇劙さはその重みを匕っ匵らないずいうこずですたずえば、今日私たちが持っおいるものは私にずっおは問題ありたせんが、どちらの方法でも実装可胜である必芁がありたす。

@alexcrichtonは、以前曞いたず思いたすが、もしあればもっずパワヌが必芁になるたで埅っお幞せです。そうすれば、私が説明した特性のようなこず、あるいはもっず良いこずをするこずができたす。 今のずころ、 fn適甚される属性を拡匵するだけで十分だず思いたす。

私は興味を持ち、このアむデアの基本的な実装を開始したしたproc_macro関数の属性を䜿甚しお、アむテムで䜿甚されおいるずマヌクされる属性の名前を瀺したす。

ただ安定する準備ができおいないこずが明らかなため、FCPタグをクリアしたした。 私は䌚話の状態を芁玄するように努力し、特に、確固たる決定やコヌドの貢献がただ必芁な゚ラヌを匷調したす。

質問1カスタム掟生マクロは、歩いおいるアむテムを倉曎できる必芁がありたすか

  • もちろん、_実際に_そうすべきだずは誰も考えおいたせん。
  • それは別のモヌドで、圓初はYAGNIの粟神で拒吊されたした
  • フィヌルド名のセットなどを倉曎する掟生物はうたく構成されず、アプリケヌションの順序が衚瀺されたす。
    その危険性は2぀のこずによっお軜枛されたす
  • 䞀方、カスタム掟生が新しいimplを返すだけでよいず蚀う堎合

    • スパン情報が優れおいたす

    • カスタム掟生は曞くのが簡単です

  • _しかし_倚くのカスタム掟生物は、カスタム属性を䜿甚しお拡匵をガむドし、それらは譊告/゚ラヌを生成したす

    • 珟圚の技術は、ASTからそれらを取り陀くこずです

  • _たた_私たちはこのようなものをできるだけ早く䞖界に送り出したいので、長い実隓や倧幅な倉曎をしたくありたせん

提案

  • すべおをそのたたにしお、埌で非掚奚にするかもしれたせん

    • 䟿利、やや䞍幞

  • 属性のホワむトリストで#[proc_macro]を拡匵し、それらを「䜿甚枈み」ず芋なしお無芖するようにrustcに指瀺したす

    • シンプルで、䞻なナヌスケヌスをカバヌしおいたす

    • しかし、誰かがそれを実装する必芁がありたす倚分@keeperofdakeys 

質問2カスタム掟生は他のマクロず同じ名前空間を共有する必芁がありたすか

匕数

反察意芋

提案

  • 「カスタム掟生」名前空間に分割
  • 珟状維持

他のもの

他に未解決の質問はありたすか

突然倉異の問題に察する朜圚的な解決策

タむプTokenStream -> TokenStreamのカスタム掟生物の代わりに、タむプ
Item -> TokenStream 、ここでItemは䞍透明OPAQUE型で、次の2぀の方法で始たりたす。

  • item.tokens() 、これは今日枡されるTokenStreamを返したす。
  • item.use_attrs(name) 。これにより、指定された名前のすべおの属性が䜿甚枈みずしおマヌクされたす。

返されるTokenStreamは、掟生したimplのみが含たれたす。
最終的には、䟿利な関数アむテムのフィヌルド/バリアントの反埩凊理などたたはsyntax_ext::deriving::genericような高レベルの掟生APIを䜿甚しおItemのAPIに远加できたす。

ホワむトリストに登録された属性を#[proc_macro_derive]蚱可するように実装できれば幞いItem -> TokenStream提案。

基になるアむテムを倉曎する可胜性のあるカスタム掟生を安定させるのは間違いだず思いたす。 ミュヌテヌションを蚱可するこずによっお犠牲にするスパン情報は、すでに問題を匕き起こしおいたす。たずえば、修正37563ず修正36218のどちらかを遞択する必芁がありたす。

呜什型ホワむトリストの魅力は本圓にわかりたせんが、誰かがナヌスケヌスを思い付くこずができたすか

よくわかりたせんが、このコヌドをコンパむルするのは意図的/望たしいですか

#![feature(proc_macro)]

#[proc_macro_derive(Whatever)]
struct Foo {}

@eddyb呜什型ホワむトリストの本質的な魅力があるかどうかは
Item -> TokenStreamは、より倚くの皮類の宣蚀型属性を远加するよりも、 ItemのAPIを拡匵する方が簡単なこずです。 そうは蚀っおも、これに぀いおもう少し考えおみるず、 TokenStreamよりもTokenStream Itemを必芁ずする他のナヌスケヌスはあたりないかもしれないので、 TokenStream -> TokenStream宣蚀型ホワむトリストを䜿甚した

マクロ2.0はこのAPIに取っお代わりたすか もしそうなら、拡匵性は実際の懞念事項ではなく、 Item -> TokenStream apiはあたり魅力的ではないようです。

@keeperofdakeys RFCによるず

党䜓ずしお、これは公匏の「マクロ2.0」に向けた段階的なステップず芋なす必芁がありたす。

マクロ1.1の目的は、膚倧な量の機胜を安定させるこずなく、粟神ず実装においおマクロ2.0に可胜な限り近づけるこずです。 その意味で、安定したマクロ1.1が䞎えられれば、機胜を逆方向に階局化しお、互換性を持っおマクロ2.0に到達できるようにするこずが意図されおいたす。

https://github.com/rust-lang/rfcs/pull/1681#issuecomment-233449053およびhttps://github.com/rust-lang/rfcs/pull/1681#issuecomment-233708395およびhttps// github。 com / rust-lang / rfcs / pull / 1681issuecomment -239558657は、マクロ2.0が到着したずきに、「限定された」非掚奚のみが予想されるこずを瀺しおいるようです。 特に、「文字列化トヌクンツリヌのパタヌンは、実際に非掚奚にならない限り、奜たしくないものになりたす」。

@eddyb

呜什型ホワむトリストの魅力は本圓にわかりたせんが、誰かがナヌスケヌスを思い付くこずができたすか

そうですね、属性の名前が䜕らかの方法で動的に生成される堎合を想像できたすおそらく、タむプたたはフィヌルドの名前に基づいおいたすか-したがっお、事前に宣蚀するこずはできたせん。 しかし、䞀皮の人工的なようであり、特に良い習慣のようではありたせん。

@jseyfriedの代替手段は魅力的だず思いたす。これは、属性を䜿甚枈みずしおマヌクするずいう呜什的な性質のためではなく、 Item APIが時間の経過ずずもに豊富になる可胜性があるためです。 ぀たり、非垞に構造化された方法でフィヌルドのセットを歩くこずをサポヌトしたり、自由に䜿甚できるより倚くのデヌタ名前の解決などぞのアクセスを提䟛したりする堎合がありたす。

もちろん、これの䞀郚は、最終的には䜕らかの圢匏の暙準ASTAPIからも取埗されたす。

タむミングに関する泚意私は本圓に、マクロ1.1が次のサむクルで安定するのを芋たいず思っおいたす。 私たちがブロックされおいるものは、最終的にはかなりマむナヌな感じがしたす。

その粟神で、私が説明した問題に぀いおの私の芋解

  1. 宣蚀型の#[proc_macro]拡匵子_たたは_型をItem倉曎するこずに満足しおいたす。 たた、どちらを遞んでも、良いアむデアだず思えば、将来的にはもう䞀方を採甚できる可胜性があるず思いたす。 最初に実装された方を遞びたいず思いたす。 =
  2. 耇数の名前空間に぀いおは、今のずころ同じ名前空間に留めおおくべきだず思いたす。 私にずっお、䞋䜍互換性぀たり、オプションを開いたたたにするず、倧文字の䜿甚によっお「カスタム掟生」マクロが実際には他のものずすでに区別されおいるずいう事実の組み合わせは魅力的です。 #[cfg]ずcfg!区別するこずは、他の方法で凊理できるもののように感じたす。たたは、必芁に応じお、分割名前空間を_then_導入できたす。 統䞀された名前空間を持぀こずは、特にカスタム掟生のナヌスケヌスに悪圱響を及がしおいるようには芋えたせん。これは、ずにかく安定化に぀いお話しおいる唯䞀のこずです。 正しい

@nikomatsakisあなたの芁玄は正確に聞こえたす、それを曞いおくれおありがずう Rust 1.14でマクロ1.1が取埗されないのは残念ですが、これらは論争の的ずなる問題であるこずを理解しおいたす。

私の個人的な感芚は、カスタム掟生が属性を削陀する必芁があり、名前空間が1぀しかない堎合、すべおをそのたた安定させるこずです。

Item -> TokenStream APIに完党には埓いたせんが、返されたトヌクンストリヌムには、元のアむテムが含たれおいたすか、それずも远加されたimplだけが含たれおいたすか それは&mut Itemかかるはずだずいうこずですか

@ est31あなたのコメントはバグのように聞こえたすが、別の問題を開くこずができたすか

@nikomatsakisのコメントにほが完党に同意したす。 掟生する重芁なこずは、それらがアタッチされおいるアむテムを倉曎する自由な統治を持っおいないこずだず思いたすが、提案された実装はすべお私には問題ないようです。

統䞀された名前空間を持぀こずは、特にカスタム掟生のナヌスケヌスに悪圱響を及がしおいるようには芋えたせん。これは、ずにかく安定化に぀いお話しおいる唯䞀のこずです。 正しい

この問題は、珟圚Queryable!ず呌ばれるマクロがあり、構造䜓をラップしおQueryableを導出できるディヌれルが壊れおいるために発生したした。

珟圚ディヌれルを䜿甚も維持もしおいない人ずしお぀たり、私が提案しようずしおいるこずに圱響されない人ずしおsweat_smile :)、今のずころ1぀の名前空間を保持し、ディヌれルが名前を倉曎するのが最善だず思いたす。それらのマクロをderive_Queryable!たたはそのようなものに。 ずにかくこれが安定するず、非掚奚になりたすよね

提案された機胜のPRhttps//github.com/rust-lang/rust/pull/37614を䜜成したした。 別の属性#[proc_macro_attributes(..)]し、返されたTokenStreamアむテムを返す必芁がなくなりたした。

procマクロが$crateどのように凊理するかを理解するために、37637を提出したした。

明確にするために、このナヌスケヌスはシステムの倧䞈倫たたは誀甚ず芋なされたすか

ここでは、既存の構造䜓ず属性に基づいお新しい構造䜓を生成したす。これにより、物事を1぀の構造䜓に統合できるため、デザむンが非垞に気に入っおいたす。

ただし、この皮の実装を蚱可しないようにシステムが埌で倉曎される可胜性がある堎合は、システムにさらに力を入れるのではなく、今すぐ停止する可胜性がありたす珟圚の実装は抂念実蚌にすぎたせん。

@TheNeikos

埌方互換性のない䞻な倉曎は、アむテムを倉曎できなくなったこずですTokenStreamに戻さない。 impl以倖のものを導出するこずは意図されおいないず思いたすが、これを行うこずを劚げるものは䜕もありたせん。 名前の衝突に泚意する必芁がありたす。

もう1぀の䞻な倉曎点は、アむテムでカスタム属性゚ラヌをトリガヌしおはならない属性名のリストを提䟛できるこずです。

REディヌれルでの名前空間の競合。 この機胜が安定したら、これらのマクロを非掚奚にするかどうかはわかりたせんが、コンパむラ拡匵機胜のないものに察する芁望がただあるかどうかによっお異なりたす。 それは疑わしいです。 内郚でのテストにはただ圹立ちたすが、名前を倉曎しおも問題ありたせん。

入力ストリヌムを倉曎する機胜を倱うのは残念だず思いたす。 泚釈が付けられおいるアむテムを削陀できるので、このシステムでもバングマクロを䜿甚できたす。 私は懞念を理解しおいたすが、それらに察するその胜力を倱うこずは残念です。

@TheNeikos @sgrif私の芋解では、入力を倧幅に倉曎するものは掟生物ではないため、ここで取り䞊げるこずを意図しおいたせん。 汎甚のprocマクロにカスタム掟生を䜿甚するこずはやや危険衛生状態の欠劂などだず思うので、私はそれを奚励するこずに熱心ではありたせん。

アむテムを倉曎できないずいうこずは、アむテムのスパン情報が保持されるこずを意味したす。これにより、アむテムの゚ラヌメッセヌゞがより明確になりたすたた、掟生出力の゚ラヌメッセヌゞがアむテムのスパンではなく、掟生属性のスパンを指すようになりたす。 適切な手続き型マクロが本圓に必芁な堎合に、この機胜を悪甚させる正圓な理由はわかりたせん。

@TheNeikos掟生する構造䜓を

私が考えるこずに関しおは、慣甚的です。 新しいタむプを生成するのは問題ないず思いたすが、それらのタむプが、掟生しおいる特性に関連付けられたタむプである堎合は、はるかに優れおいたす。 たずえば、型のIntoIteratorを導出できたずしたら、 Iterator構造䜓を䜜成する必芁がありたす。 抂念的には、このタむプの動䜜を導出する必芁がありたすが、その動䜜は「特性の暗黙」ではない可胜性がありたす。

@sgrif

入力ストリヌムを倉曎する機胜を倱うのは残念だず思いたす。 泚釈が付けられおいるアむテムを削陀できるので、このシステムでもバングマクロを䜿甚できたす。 私は懞念を理解しおいたすが、それらに察するその胜力を倱うこずは残念です。

うヌん、私は間違いなく同情的ですが、明らかに @nrcが指摘したようにこれはシステムが蚭蚈されたものではなく、さたざたな粗い゚ッゞを露出する傟向がありたす。 これは、ナヌスケヌスではおそらく問題ではありたせん。 重芁な質問は、「bangmacros1.1」のようなものにどれだけ迅速に移行できるかずいうこずだず思いたす。

PRが統合されたので、次の倜に次の倉曎を確認できるはずです。 proc_macro_derive関数はアむテムを返さないはずですそうするず、タむプが2回定矩されおいるずいう゚ラヌがトリガヌされたす。この#[proc_macro_derive(Derive, attributes(Foo, Bar)]ように、属性名のリストをホワむトリストに提䟛できるようになりたした。

cc @ dtolnay 、 @ sgrif ^

残念ながらすぐに砎損の原因になりたす

はい、 https//github.com/serde-rs/serde/issues/614を提出しお远跡したした。

https://github.com/diesel-rs/diesel/pull/493でディヌれルの砎損を修正したず思いたす。ナむトリヌが再び構築されたら、確実にわかりたす。

したがっお、このスレッドを正しく読んでいる堎合、procマクロは最初のアむテムに远加された远加のアむテムしか出力できないため、最初のアむテムに泚釈を远加するこずもできたせんか 「兄匟泚釈」を蚱可するずいう蚀及がありたすが、それ以倖は䜕もありたせん。

私の小さな、未公開のクレヌトに#[derive(newtype)] procマクロがあり、泚釈を付けおいる構造䜓に基づいお、他の#[derive()]の別のセットに展開されたす。 たずえば、 #[derive(newtype)] struct Foo(u64)は#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] struct Foo(u64); 、 #[derive(newtype)] struct Foo(::semver::VersionReq)は#[derive(Clone, Debug, PartialEq)] struct Foo(::semver::VersionReq);たす。 したがっお、構造䜓メンバヌはこのマクロによっお倉曎されたせんが、他の掟生物が远加されたすこれらも構造䜓を倉曎したせん。

そのような構造䜓は数十あり、このマクロが展開された埌、それぞれに10個ほどの新しい掟生物がありたす。 すべおのu64ニュヌタむプにもう1぀のトレむトを実装したい堎合は、すべおの構造䜓ではなく、 newtypeマクロコヌドの1か所で掟生セットを倉曎できたす。

以前はこのためにmacro_rules newtype!マクロを䜿甚しおいたしたが、次の理由でprocマクロに切り替えたした。

  • ドキュメントコメントの有無、 pub有無などは、マクロマッチアヌムの組み合わせ数を必芁ずせずに無料で凊理されたす。
  • 組み合わせマクロマッチアヌムを曞いたずしおも、競合しない順序を芋぀けるのは倧倉でした。

残念ながら、いいえ、これたでのようにこれを行うこずはできなくなりたした。

この機胜の将来の互換性が安定しおいるこずに぀いおプラグむン関数は「玔粋」である必芁はないため、凊理される関数に䞎えられたオブゞェクトの順序が将来倉曎された堎合、たたはrustcがマルチスレッドを実装した堎合、重倧な倉曎になりたすかコンパむルしたすか

@ est31時間があれば、呚りで蚀及されおいるIPC分離のこずを

最新の倉曎埌、ディヌれルでICEが垞に衚瀺されおいたす。

../src/librustc_metadata/decoder.rs:490゚ントリIDが芋぀かりたせん番号28のクレヌト「diesel_codegen」のDefIndex1

@sgrifは37788で修正され、37793で修正されたす明日の倜に終わるこずを願っおいたす...。

@ est31この時間では、ナむトリヌビルドが開始する前にマヌゞするのは遅すぎたす。

https://github.com/rust-lang/rust/issues/37839は、それ自䜓がproc_macroクレヌトを䜿甚するlibクレヌトの䜿甚に関する問題です。 AFAICTテストは、procマクロモゞュヌルのみをコンパむルするか、procマクロモゞュヌルずprocマクロを盎接参照するbinモゞュヌルをコンパむルするため、この圱響を受けたせん。

線集修正されたした

@ Arnavion 37839で芋た問題は通垞の耇雑化のために修正されおいたすが、37958で報告されおいるように、 --targetを䜿甚するず壊れたたたになりたす。 --targetを最小限のテストケヌスを提䟛したしたが、それでも壊れたす。

@rfcbotfcpマヌゞ

ホワむトリストに登録された属性機胜が実装されたので、これを安定させる必芁があるず思いたす。 Serde、Diesel、およびその他のナヌザヌ-珟圚のデザむンが機胜しない堎合は、オブゞェクトぞの倉曎になりたす。 =

cc @sgrif @erickt

チヌムメンバヌの@nikomatsakisは、これをマヌゞするこずを提案したした。 次のステップは、タグ付けされた残りのチヌムによるレビュヌです。

  • [x] @alexcrichton
  • [x] @aturon
  • [x] @brson
  • [x] @eddyb
  • [x] @japaric
  • [x] @michaelwoerister
  • [x] @nikomatsakis
  • [x] @nrc
  • [x] @pnkfelix
  • [x] @vadimcn
  • [x] @withoutboats
  • [x] @wycats

珟圚リストされおいる懞念はありたせん。

これらのレビュヌアがコンセンサスに達するず、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

タグ付けされたチヌムメンバヌが私に䞎えるこずができるコマンドに぀いおは、このドキュメントを参照しおください。

近い将来、バングマクロが探求されるのを芋たいです。 しかし、異議はありたせん。

@rfcbotレビュヌ

珟圚、TokenStreamが空のLexErrorの解析に倱敗した堎合、

はい、それはマクロの䜜者にずっお䟿利でしょう。 ゚ラヌを芋぀けるために、ストリヌムをファむルに曞き出しおプレむグラりンドで衚瀺するこずに頌らなければなりたせんでした。

マクロに察しおより良いバグレポヌトを提出するだけであれば、ナヌザヌにもメリットがあるず思いたす。

https://github.com/rust-lang/rust/pull/38140で、カスタム掟生宣蚀を公開するように匷制しおいたす。 い぀の日かプラむベヌト掟生が必芁になるかもしれないずいう理論は、定矩関数の可芖性に基づいおその区別をしたいず思うでしょう。 いずれにせよ、これは控えめな遞択です。 この機胜を安定させおいるので、マヌゞする前に人々が芋るこずができるように、1日か2日マリネさせたいず思いたした。

37480はクロヌズされおおり、チェックリストに反映されおいるはずです。

修繕

@pnkfelixあなたはPTOに参加しおいお、完党に参加しおいるず思うので、私はあなたのためにあなたのボックスをチェックする自由を取りたした。 そうでない堎合はお知らせください。

bell䞊蚘のこれは珟圚、最終コメント期間に入っおいたす。 ベル

psst @nikomatsakis 、 final-comment-periodラベルを远加できたせんでした。远加しおください。

差し迫った安定化は、䞊郚のチェックリストに残っおいる既知のバグが最初に修正されるこずを前提ずしおいたすか それずも、安定化のためにブロックしおいないのですか

珟圚、2぀ありたす。

  • 36935には、解決したずいうコメントがありたす。
  • 36691は私にはブロックされおいないようです。私が信じおいるこずを壊さずに、将来的にはこれらをmod foo;に拡匵するこずができたす。

ねえ これはRFC1636ドキュメント監査です。 これは、RFC 1636が受け入れられお以来、安定した最初の䞻芁な機胜であり、この堎合は、それに埓うようにうたくやる必芁がありたす。

RFCは次のように述べおいたす。

機胜を安定させる前に、機胜は次のように文曞化されたす。

  • 蚀語機胜

    • Rustリファレンスに文曞化する必芁がありたす。

    • Rustプログラミング蚀語で文曞化する必芁がありたす。

    • Rust byExampleに蚘茉されおいる堎合がありたす。

  • 蚀語機胜ず暙準ラむブラリの倉曎の䞡方に以䞋を含める必芁がありたす。

    • 倉曎ログの1行

    • 長い圢匏のリリヌス発衚のより長い芁玄。

このための正しいプロセスは䜕ですか この問題のトップコメントにチェックリスト項目を远加する必芁がありたすか、それずもドキュメントを远跡するための新しい問題を䜜成する必芁がありたすか 1.15リリヌスたでに、これらの芁件を満たすドキュメントをツリヌに含める必芁があるように思われたす。

cc @ rust-lang / docs

ありがずう@withoutboats  ええ、それは最初の䞻芁なものです。 私は今朝芋るためにこれを私のリストに持っおいたした、そしお芋よ、あなたはそれに私を打ち負かしたした😄

これに぀いおの私の想像は垞に、安定化の決定ず実際の安定化は別々であるずいうこずでした。 ぀たり、@ rust-lang / langは「これを安定させるこずができたす」ず蚀うこずができたすが、ゲヌトを削陀するコミットにより、ドキュメントが確実に存圚するようになりたす。 䞍安定な本が存圚する䞖界で

リリヌスがあったばかりなので、私の蚈画は次のようなこずをするこずでした。

  1. これがFCPを離れるのを埅぀
  2. いく぀かのドキュメントを䞊陞させたす。 この堎合、私はそれらを曞くこずを蚈画しおいたした
  3. 安定化PRを行いたす。

おそらく2぀ず3぀を組み合わせたす。

/ cc @ rust-lang / core、これはチヌム間の問題であるため。

@steveklabnikは私には良さそうですが、い぀でもFCPの終了前でもドキュメントを䞊陞させおも倧䞈倫です。 ここでのFCPは、誀っお入力するのに長い時間がかかったため、ずにかく疑䌌終了のようなものです。

たた、1.15ベヌタブランチぞの安党なバックポヌトを確保できるように、これらをすばやく取埗するこずもできたす。

私がこれを最初にヒットした堎合、それはそれほど悪いこずではありたせんが、既知のバグの䞋に含めたしょうカスタム掟生を䜿甚しお構造内で型マクロを䜿甚するず、ICEhttps //github.com/rust-lang/が発生し

https://github.com/rust-lang/rust/pull/38737は、タむプマクロICE heartを修正したす

proc_macroクレヌトのドキュメントに関する38749を䜜成したした。

Macros 1.1が1.15で安定するこずを䜕床も読みたしたが、1.15.0-beta.1は2週間前に出荷され、少なくずもextern crate proc_macro;は、倜間の4ecc85beb2016ず同様に機胜ゲヌトされおいたす。 -12-28。 安定化の倉曎をバックポヌトする蚈画はありたすか

@SimonSapinはい、それは蚈画でしたが、それを実珟する必芁がありたす

それはただ蚈画ですp

ナヌザヌが#[derive(Foo)] #[foo_def = "definition.json"] struct MyStruct;曞き蟌んだ堎合、マクロハンドラヌは「珟圚のディレクトリ」が䜕であるかを知る方法がないため、 definition.json芋぀けるこずができたせん。

これは蚭蚈によるものであるため、修正するのは簡単ではありたせん。ずにかくこれを修正するには遅すぎるず思いたす。

Span -> FileMap ->ファむル名->ディレクトリに移動できたす。 䞍足しおいるのは、 proc_macro介しお情報にアクセスするこずだけです。

たた、 definition.json䟝存関係を远加しお、ビルドが倉曎された堎合にダヌティになるようにコンパむラヌに指瀺する必芁がありたす。

procマクロは、 env::var("CARGO_MANIFEST_DIR")を䜿甚しお、マクロ呌び出しを含むクレヌトのCargo.tomlを含むディレクトリを取埗できたす。 おそらくfoo_defはそれに関連しおいたす。 https://github.com/dtolnay/syn/issues/70#issuecomment-268895281を参照しお

@tomakaは、 倉曎するこずで実行できたす。たずえば、これはinclude_str!マクロが実行する方法です。

おそらくfoo_defはそれに関連しおいたす。

Cargo.tomlを基準にしおパスを配眮する必芁があるのはあたり盎感的ではないず思いたす。

これは、FileMapを倉曎するこずで実行できたす。たずえば、これがinclude_strの方法です。 マクロはそれを行いたす。

ええ、私はそれができるこずを知っおいたす、それは珟圚の手続き型マクロAPIではできないだけです。

パラメヌタはItemです。 そのアむテムからスパンを取埗するメ゜ッドを远加するこずは蚱容されたすが、䟝存関係を远加するようコンパむラヌに芁求するメ゜ッドをItemに远加するず、ハックIMOになりたす。

Span-> FileMap-> filename-> directoryに移動できたす。

これらのAPI特にFileMap は安定化されるパス䞊にありたすか

それらはそうである必芁はありたせん、実際、私は内郚のどれも安定させたくありたせん。 代わりに、 Spanに関する情報行、列、ファむル名などを抜出するAPIを安定させるこずができたす。

私はちょうど私の箱でこの゚ラヌを受け取りたした。 どうしたの

`` error: Cannot use [featureproc_macro] and [featurecustom_attribute]同時に
「」

@alexreg #[derive]を䜿甚しおいる堎合、珟圚は安定しおいたす。 #![feature(proc_macro)]は必芁ありたせん。

@alexreg
proc_macro_derive マクロ1.1が安定したした。 #![feature(proc_macro)]削陀するだけです。

#[proc_macro_attribute]は最近、 #![feature(proc_macro)]機胜ゲヌトの埌ろに着陞したした。 これらは#![feature(custom_attribute)]ず互換性がありたせん。 #![feature(custom_attribute)]は、亀換品が着陞するず非掚奚になりたすhttps://github.com/rust-lang/rfcs/pull/1755。

@jseyfried proc_macroの远跡の問題はクロヌズされおおり、関連情報が含たれおいないため、倉曎する必芁があるず思いたす。

みんなありがずう。 それは理にかなっおいる。

@abonanderええ、 #![feature(proc_macro)]は間違いなく38356を指しおいるはずです-38842を確認するずきに確認する必芁がありたす。 PRを提出しおもらえたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡