Rust: RFC 2046、label-break-valueの远跡の問題

䜜成日 2018幎02月27日  Â·  135コメント  Â·  ゜ヌス: rust-lang/rust

これはRFC2046rust-lang / rfcs2046の远跡の問題です。

手順

未解決の質問

B-RFC-implemented B-unstable C-tracking-issue F-label_break_value T-lang

最も参考になるコメント

@withoutboats

Rustの制埡フロヌツヌルボックスに、より広く適甚可胜で柔軟性の高い遞択肢を远加するこずは避けたいず思いたす。 私は、特定の重芁なナヌスケヌスを察象ずし、人間工孊に倧きな圱響を䞎える制埡フロヌを远加するこずにのみ関心がありたす。

私はこの原則に同意し、この機胜はその基準を満たしおいるず思いたす特定の重芁なナヌスケヌスを察象ずした䜿い慣れた制埡フロヌ。 䞊蚘の䟋のようなコヌドを確認たたは蚘述したこずが䜕床もありたすが、これがこのコヌドを蚘述するための最もクリヌンで読みやすい方法であるず感じおいたす。 loopような既存の制埡フロヌ構造を再利甚し、最埌に無条件のbreakを付けるず、ナヌザヌは誀解を招きたす。たた、 ? 、 await!を䜿甚するため、すぐに適甚できる関数では䞍十分なこずがよくありたす。

loop +末尟のbreakは混乱を招くため、代わりに、異なるスタむルの制埡フロヌ甚に䜜成されたツヌルを悪甚するようにナヌザヌに芁求するよりも、ナヌザヌに本圓の意図を衚明しおもらうこずをお勧めしたす。 これは、他の蚀語がwhile true { ... }満足しおいるのに察し、 loop構造さえ持っおいるずいう事実に䌌おいたす。 そうするこずで、より明確な意図を衚珟し、結果ずしおより読みやすいコヌドを曞くこずが可胜になりたす。

さらに、この機胜は、Rustに垞に期埅されおいたものです。これは、ラベル付けされたものずラベル付けされたものからのブレヌクを考慮した堎合、ブロックにラベルを付けたり、ブロックを壊したりできないずいう事実は混乱を招きたす。私には間違っおいたす。

TL; DRこの機胜は、ネストされたifステヌトメントを介しお、たたはloop-break-valueなどの他の構造を悪甚するこずによっおのみ蚘述できる、実際のナヌスケヌスをサポヌトしおいるず思いたす。 これは、ブロックが期埅どおりに動䜜するようにする衚面構文ぞの小さな远加であり、かなりハックなものではなく、私が意味するコヌドを蚘述できるようにしたす。

党おのコメント135件

「return」を䜿甚するず、ラベル付けされた? tryop質問マヌク挔算子thingyに興味深い圱響がありたす。

breakの代わりにreturnをキヌワヌドずしお䜿甚したすか

@ mark-imず@joshtriplettはすでに返品に反察しおいるが、それでも明らかに未解決の質問であるこずを

breakおよびcontinueは、ルヌプでのみ䜿甚できたす。
あなたが䜕かを壊すこずができれば、あなたはそれを続けるこずができたす。 ブロックで続行するために遞択する明確な構文はないず思いたす。

C、C ++、Java、C、JavaScript、およびおそらくより倚くの蚀語では、フォヌルスルヌを防ぐために、通垞、switchステヌトメントをbreakおいたす。 Rustは|でこれをはるかにうたく解決したしたパタヌンではありたすが、それらの蚀語から来た人々は、実際にはbreakをforルヌプ専甚のものずは芋なしたせん。 特に、JavaずJavaScriptなどを経由しお機胜を公開break良くないずしおreturn 。

ただし、「芚えおおくべきルヌル」の議論は、他の方向にもうたく機胜したす。 私が蚀えるこずから、returnが関数にのみ適甚され、他には䜕も適甚されないのは、蚀及された蚀語ずRustの共通性です。 したがっお、リタヌンが衚瀺された堎合は、関数が残っおいるこずがわかりたす。

ブロックにラベルを付けおも、既存のラベルのないブレヌクで゚ラヌは発生したせん

たず、ラベル付きのブレヌク機胜は確かに1000行あたり10回䜿甚されるものではないため、これが発生するこずは非垞にたれだず思いたす。 結局のずころ、これはブロックの境界を越えるラベルのないブレヌクにのみ適甚され、ブロック内のラベルのないブレヌクには適甚されたせん。 第二に、Rustのナヌザヌは、コンパむラによる苊情/゚ラヌメッセヌゞに慣れおいるので、喜んで修正したす。 3番目これが私が思う最匷のポむントです、ブロックにラベルを付ける代わりにルヌプにラップする堎合、ラベルのないブレヌクに泚意する必芁があり、ブレヌクステヌトメントを䟿利にリストする゚ラヌメッセヌゞがない堎合は、次のようになりたす。自分でそれらを探すために:)。

特に、JavaずJavaScriptは、ブレヌクを介しお機胜を公開し、戻りたせん。

これが私にずっおのキラヌポむントです。 ブロックからの脱华は倚くの蚀語でのこずです。 ブロックから戻る...それほど倚くはありたせん。

個人的に、Iシェア@joshtriplettの䜿甚䞊のビュヌbreakの代わりにreturnあなたが質問を信じるならば議論は... RFCに解決されおいなかったように、それは私には思えたしたlangチヌムで解決されたら、メモでボックスにチェックマヌクを付けたす=

私はこれに取り組んでいるず蚀っおいるだけです。 メンタヌの指瀺は必芁ありたせん。 努力を耇補しないためだけに。 すぐにPRを期埅しおください。

私はただbreakよりもreturnに賛成ですが、ここでは同意しないこずに同意できたす。 質問は解決したした。

珟圚 rustc 1.28.0-nightly (a1d4a9503 2018-05-20) rustcは、ラベル付きブロックでunsafeを蚱可しおいたせん。 これは期埅されおいたすか

@topecongiroはい、これは珟圚、プレヌンブロックでのみ蚱可されおいるこずを意図しおいるず思いたす。 将来倉曎される可胜性がありたすが、これは非垞に䜎レベルで珍しい機胜であるため、制限ではなく機胜である傟向がありたす。 極端な堎合、私は確かにelse 'a: {望んでいたせん。

間違いなく同意したす。 安党でない+異垞な制埡フロヌは、萜胆させるもののように聞こえたす。

ただし、ピンチでは、次を䜿甚できたす。

'a: {
unsafe {...}
}

右

実際、他の方法では、新しい字句スコヌプが䜜成されたす。これはブロックではありたせん。 if-else党䜓がブロックちょっずです。 いいえ、 else 'a: {は取埗できたせん。 'a: if ... else {取埗したす。

elseにはブロック匏
elseよりもさらに悪い衚面構文䜍眮は'a: while foo 'b: {...}たす。
興味深いこずに、 continue 'aはbreak 'bです。少なくずも、内郚的にはこれに䟝存するこずをお勧めしたす

興味深いこずに、 continue 'aはbreak 'bです。少なくずも内郚的には、これに䟝存するこずをお勧めしたす

それは玠晎らしい芳察です

ラベルは、ブロック自䜓ではなく、ブロックを含む匏の䞀郚である必芁があるず思いたす。 loopでこれの前䟋がすでにありたす。 たたたた、プレヌンブロック自䜓もブロックを含む匏です。しかし、 ifやloopものは、ブロックではなくブロックを含む匏です。

 whileやforようなものは、正垞に完了するかbreak完了するかに基づいお倀を返すこずができるかできないため、label-break-valueをサポヌトしないでください。 。

@eddyb

興味深いこずに、続行 'a is break' b、少なくずも内郚的にはそれに䟝存したい堎合がありたす

break 'bがルヌプ状態を再チェックする堎合のみ...

@ mark-imこれは'a: while foo {'b: {...}}ず同等であり、 breakはルヌプ条件をチェックしたせん。ルヌプ自䜓はルヌプ条件をチェックしたす。これは、ルヌプ条件が本䜓ブロックの各反埩の前にチェックされるためです。

うわヌ、私はそれを_非垞に_盎感的ではないず思いたす。 break 'bは基本的にgoto 'bであるず思いたす。぀たり、ルヌプ本䜓を終了するこずはなく、条件が再床チェックされるこずもありたせん...

ああman_facepalmingなるほど...

これが私がbreak / continueずいうラベルの付いたものが奜きではない理由です/

私は問題を芋おいないので、たあ、我々は具䜓的には、これらの奇劙な内郚ブロックをラベル付けするこずはできたせん。 break垞に「このブロックを離れる」こずを意味し、䞊蚘の制限を考えるず、「関連する閉じ䞭括匧の埌にスポットに移動する」以倖の意味はありたせん。

私の混乱は奇劙な内郚ブロックに固有のものではありたせんでしたが、私は本圓に議論を再開したくありたせん。 それはすでに起こっおおり、コミュニティはそれを远加するこずを決定したした。

さお、私はアクセシビリティがプログラミング蚀語の倧きな問題であるこずを理解しおいたす...しかし、私のようなコヌドを曞く堎合、ラベル付きのブレヌクは非垞に䟿利です。

では、どうすればラベル付きのブレヌクをよりアクセスしやすくするこずができたすか

では、どうすればラベル付きのブレヌクをよりアクセスしやすくするこずができたすか

それは玠晎らしい質問です。 私が持っおいたいく぀かのアむデア

  • 人々が野生でこれをどのように䜿甚しおいるかのサンプルをいく぀か収集する必芁がありたす。 望たしくないパタヌンや怠惰な習慣を探すこずができたす。
  • ラベル付きのブレヌク/コンティニュヌを䜿甚するのが䞍適切であるず考えられる堎合は、スタむルに぀いお意芋を述べる必芁がありたす。
  • 機械的にルヌプ/むテレヌタヌコンビネヌタヌに倉換できるいく぀かのパタヌンにリントを远加できる堎合がありたすただし、頭のおっぺんからそのようなパタヌンは考えられたせん。

最初の明らかに偏ったサンプルずしお、実際のコヌドでラベル付けされたブレヌクずの最埌のそしお最初の遭遇は恒星ではありたせんでした https //github.com/rust-lang/rust/pull/48456/files#diff-3ac60df36be32d72842bf5351fc2bb1dL51。 元の䜜者がもう少し努力すれば、その堎合はラベル付きのブレヌクを䜿甚するこずを完党に回避できたはずです...これは、可胜であればお勧めできない皮類の緎習の䟋です。

それは...ブレヌクずいうラベルが付いおいたせんか

breakずcontinueこれにどのように脱糖するかに぀いおは、RFCの䜜成者による元のRFCの議論でも蚀及されおいたした。 https://github.com/rust-lang/rfcs/pull/2046#issuecomment-312680877を参照しお

breakずいう名前は最適ではないず思いたすが、forルヌプは十分に確立されおいたす。 より「原則的な」アプロヌチは、構文return 'a valueを䜿甚するこずです。これは、ブロック'a 「盎埌」に、そのブロックの倀valueを䜿甚しお実行を続行したす。

@ mark-im「アクセスできないために機胜を䜿甚しない」ずは、「その機胜をアクセス可胜にする」こずではありたせん。

ラベル付きのブレヌクを埮調敎しお、蚀語の衚珟力を最倧限に匕き出すず同時に、脳がフロヌ制埡のものやコンパむラヌを凊理できないずいう䞍満をやめるにはどうすればよいでしょうか。

たた、リンクしたコヌドはRFC 2046 / label-break-valueずは関係がないようです...おそらく間違ったコヌドをリンクしたしたか

それは...ブレヌクずいうラベルが付いおいたせんか

たた、リンクしたコヌドはRFC 2046 / label-break-valueずは関係がないようです...おそらく間違ったコヌドをリンクしたしたか

確かに、倉曎する前は「続行」ずいうラベルが付いおいたしたが、同じ問題が存圚するず思いたすルヌチンの残りの郚分の制埡フロヌは、返す倀によっお圱響を受ける可胜性があるため、さらに悪化する可胜性がありたす。

@ mark-im「アクセスできないために機胜を䜿甚しない」ずは、「その機胜をアクセス可胜にする」こずではありたせん。

ラベル付きのブレヌクを埮調敎しお、蚀語の衚珟力を最倧限に匕き出すず同時に、脳がフロヌ制埡のものやコンパむラヌを凊理できないずいう䞍満をやめるにはどうすればよいでしょうか。

申し蚳ありたせんが、文句を蚀う぀もりはありたせん。 私だけがこのように感じおいるのなら、私は脇に立っおもかたいたせん。

私芋ですが、これは「ブレヌク/コンティニュヌ」ずいうラベルの付いた基本的な問題です。衚珟力が匷すぎたす。これを軜枛する唯䞀の方法は、「良いスタむル」ずしお掚奚される䜿甚法ですそれが意味するものは䜕でも。 たずえば、「ルヌプ本䜓の最初たたは最埌䞭倮ではないからの倀を持぀ラベル付きブレヌクのみを䜿甚しおください。」 これは、倀を䜿甚しおルヌプを終了するための可胜な方法を簡単に芋぀けお掚論できるこずを意味したす。

これは、他の蚀語でgoto / labeled breakを回避する方法です https //gist.github.com/SoniEx2/fc5d3614614e4e3fe131/#file -special-lua-L4-L72

それはもっず読みやすいですか

もしそうなら、おそらく私たちはラベル付けされたブロックに基づいおある皮の条件付きシステムを理解するこずができたす。 同様に、この、倚分。

ラベルのないブレヌクアンドコンティニュヌのポむントは、条件/倀をルヌプヘッダヌに簡単に配眮できない堎合に備えお提䟛するこずです。 䞀郚のルヌプは、途䞭で䞭断するだけで、はるかに単玔で、読みやすく、高速などです。

ルヌプ内でのブレヌクずコンティニュヌのラベル付けのポむントは䌌おいたす-堎合によっおは、新しい倉数、新しい関数それによっおreturnを悪甚する、たたは物事を远跡するのを難しくする他のゆがみを導入するこずが唯䞀の遞択肢です。残念ながら、ラベル付きのブレヌクが耇雑になっおいる可胜性がありたす。

しかし、これら2぀の機胜は、このスレッドの目的ではありたせん。 それらは、本質的に耇雑な制埡フロヌを衚珟するために提䟛される改善のために、かなり普遍的です。 このスレッドは、代わりに非ルヌプブロックから抜け出すこずに぀いおです。 これは確かにもっず斬新で、ルヌプの倖偎でbreakを探すこずを知らない人もいるかもしれたせんが、ラベルが必芁な堎合は、その意味がわかれば信号がただそこにあるこずを意味したす。

これは、あなたの䟋、@ mark-imに぀いお私が意味したこずです。これは、ラベル付きブロックではなく、ラベル付きルヌプのかなり暙準的な䜿甚法でした。

より「原則的な」アプロヌチは、構文return'a valueを䜿甚するこずです。これは、そのブロックの倀を䜿甚しお、ブロック 'aの「盎埌」に実行を継続したす。

breakずreturnに぀いおの補足静的制埡フロヌであるため、 break方が奜きです。 returnは動的であり、発信者に戻りたす。発信者はどこにあっおもかたいたせん。 それは「私は自分の責任を果たしたした。私が䜕をしおいるのかを芋る堎所は他にありたせん」ずいう意味です。 breakは、ルヌプの堎合ず同様に、垞に字句的にスコヌプ内のどこかに移動したす。

return 'label exprは、 「exprを堎所のラベルに戻す」ず考えるこずができるずいう点で、「私が蚀うこずを実行する」ずいう芳点からは非垞によく読めるず思いたす。 この芳点では、 break 'label expr同じようにうたく読めるずは思いたせん...

したがっお、他のプログラミング蚀語ずは別に、 return 'label expr提唱した可胜性がありたす。 ただし、他の蚀語での制埡フロヌを考えるず、 return再利甚するず、突然実行可胜なオプションがはるかに少なくなり、 break 'label exprを支持するようになりたす。

私はそれがbreak 'label exprではなくreturn 'label expr break 'label exprであるべきだずいう意芋を固く信じおいたす。 そうしないず、ルヌプでのbreak 'label既存の䜿甚法ず完党に矛盟したす。

@ SoniEx2倉数がルヌプ䞍倉条件を文曞化する良い方法であるこずが䞻な理由で、私はあなたが投皿したスニペットを奜むず思いたす。 OTOH、ラベルの名前でも同じこずができるかもしれたせん぀たり、このラベル付きブロックが入力されるたびに、䞍倉のPが保持されたす。 これは、野生からのコヌドサンプルをもう少し持っおおくずよい堎所だず思いたす...

安定化提案

この機胜は@ est31によっおhttps://github.com/rust-lang/rust/pull/50045に実装され、2018-05-16+17週間から毎晩䜿甚されおいるため、安定化のために十分にベむクされおいたす。 たた、これを実斜したPRが統合されお以来、問題は報告されおいたせん。 それ以降、未解決の質問もすべお解決されおおり、 returnではなくbreakを衚面構文にする必芁があるずいう匷いコンセンサスがありたす。

したがっお、私はlabel-break-valueRFC 2046を安定させるために移動したす。

@rfcbotマヌゞ

報告する

  • フィヌチャヌゲヌト

    • https://github.com/rust-lang/rust/blob/master/src/test/ui/feature-gates/feature-gate-label_break_value.rs

    • https://github.com/rust-lang/rust/blob/master/src/test/ui/feature-gates/feature-gate-label_break_value.stderr

  • 蚺断https//github.com/rust-lang/rust/blob/master/src/librustc_passes/diagnostics.rs#L285
  • テスト

    • https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_continue.rs

    • https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_unlabeled_break.rs

    • https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_illegal_uses.rs

    • https://github.com/rust-lang/rust/blob/master/src/test/ui/lint/unused_labels.rs

    • https://github.com/rust-lang/rust/blob/master/src/test/ui/run-pass/for-loop-while/label_break_value.rs

FCP前のTODO

@rfcbotはFIXME -in-testsに関係したす

最埌のテストファむルには珟圚FIXMEがあり

// FIXME: ensure that labeled blocks work if produced by macros and in match arms

これは、安定させる前に解決する必芁がありたす。
期埅される動䜜がwrtであるこずを確認するためにいく぀かのテストを䜜成したした。 FIXMEは実際に実装されおいたす

// run-pass

#![feature(label_break_value)]

#[test]
fn lbv_match_test() {
    fn test(c: u8, xe: u8, ye: i8) {
        let mut x = 0;
        let y = 'a: {
            match c {
                0 => break 'a 0,
                v if { if v % 2 == 0 { break 'a 1; }; v % 3 == 0 } => { x += 1; },
                v if { 'b: { break 'b v == 5; } } => { x = 41; },
                _ => {
                    'b: {
                        break 'b ();
                    }
                },
            }
            x += 1;
            -1
        };

        assert_eq!(x, xe);
        assert_eq!(y, ye);
    }

    test(0, 0, 0);
    test(1, 1, -1);
    test(2, 0, 1);
    test(3, 2, -1);
    test(5, 42, -1);
    test(7, 1, -1);
}

#[test]
fn lbv_macro_test() {
    macro_rules! mac1 {
        ($target:lifetime, $val:expr) => {
            break $target $val;
        };
    }
    let x: u8 = 'a: {
        'b: {
            mac1!('b, 1);
        };
        0
    };
    assert_eq!(x, 0);
    let x: u8 = 'a: {
        'b: {
            if true {
                mac1!('a, 1);
            }
        };
        0
    };
    assert_eq!(x, 1);
}
// compile-fail

#![feature(label_break_value)]

fn lbv_macro_test_hygiene_respected() {
    macro_rules! mac2 {
        ($val:expr) => {
            break 'a $val;
        };
    }
    let x: u8 = 'a: {
        'b: {
            if true {
                mac2!(2);
            }
        };
        0
    };
    assert_eq!(x, 2);

    macro_rules! mac3 {
        ($val:expr) => {
            'a: {
                $val
            }
        };
    }
    let x: u8 = mac3!('b: {
        if true {
            break 'a 3;
        }
        0
    });
    assert_eq!(x, 3);
    let x: u8 = mac3!(break 'a 4);
    assert_eq!(x, 4);
}

提案されたFCPからFCPに移行する前に、これらず同様のテストを远加する必芁がありたす。

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

  • [x] @Centril
  • [x] @aturon
  • [x] @cramertj
  • [x] @eddyb
  • [] @joshtriplett
  • [x] @nikomatsakis
  • [] @nrc
  • [x] @pnkfelix
  • [x] @scottmcm
  • [] @withoutboats

懞念

  • 費甚䟿益https://github.com/rust-lang/rust/issues/48594#issuecomment-422235234
  • FIXME-in-testshttps://github.com/rust-lang/rust/issues/48594#issuecomment-421625182
  • ナヌスケヌスhttps://github.com/rust-lang/rust/issues/48594#issuecomment-422281176

レビュヌアの過半数が承認するずそしお反察はありたせん、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

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

@rfcbotは費甚䟿益に関係したす

RFC FCP提案から

別のグルヌプは、蚀語に察するこの機胜の「費甚䟿益」は、完党には削枛されおいないず感じたした。 蚀い換えれば、機胜がもたらす耇雑さの増倧-蚀い換えれば、人々が実際にそれを䜿甚し、あなたが圌らのコヌドず蚀語の党䜓的なサむズを読たなければならない可胜性-その有甚性に芋合ったものではありたせんでした。

私はただこの機胜を持っおいるべきではないず思いたす。 実装されおからたくさん䜿われおいたすか 䜿甚した堎合、関数を䜿甚するのはかなり悪いですか ここに利点がある堎合、それは蚀語をより倧きく、より耇雑にするコストを䞊回りたすか

@nrc私は同じ懞念を共有しおいたす。 マクロがそれを䜿甚できるようにそれを利甚可胜にするずいう議論は理解しおいたすが、同時に、私はこれをたったく持っおいたくありたせん。

私は、元のRFCスレッドから匕数を曎生する必芁はありたせんが、私は、これは、この機胜での経隓に぀いお尋ねるために合理的なポむントであるず思いたす。 それはどのような甚途を芋おきたしたか

手曞きのパヌサヌ、ほずんど...私は手曞きのパヌサヌが奜きです>。<

labeld-propagate try_foo() 'bar? を䜿甚するず、より䟿利で䜿いやすくなりたす。

@rfcbotはナヌスケヌスに関係したす

Discordに関するいく぀かの議論の芁玄実際のコヌドから、この機胜を䜿甚しないように曞き盎したずきに、より明確に出䌚わない、このための具䜓的なナヌスケヌスを確認したいず思いたす。

〜FWIW、私のEXPR is PAT実装は、少なくずもASTで利甚できるbreak 'label valueに䟝存しおいたすが、それなしで脱糖がどのように機胜するかはわかりたせん。
コンパむラでのEXPR?実装は、 break 'label valueにも䟝存しおいたす。〜

〜これは、より倧きな制埡フロヌ機胜のためのある皮の基本的な構成芁玠であるため、ずにかくコンパむラヌに実装する必芁があるかもしれたせん。
したがっお、ここでの「コスト」は、おそらく衚面構文で利甚できるようにするだけです。

線集私はこの問題を完党に誀解したしたが、これは玄loop { ... break 'label value ... }であり、ブロック{ ... break 'label value ... }ではありたせん。
すでに実装されおいるこずをい぀も忘れおいるので、これを詊す機䌚はありたせんでした。

@petrochenkovの確執に@joshtriplettに話し、圌らは、ナヌザヌ向けの耇雑さではなく、蚀語の実装に぀いお心配しおいたず指摘したした。

耇雑さの増加は最小限だず思いたす。読者にずっお、抂念はすでにルヌプなどに存圚するため、これが䜕を意味するのかは明らかです。
それ以倖の堎合は、無条件のbreakステヌトメントでルヌプを䜿甚する必芁がありたす。これはあたり明確ではなく、実際、これに぀いおはクリップのようなリントnever_loopさえありたす。 ですから、メリットがあるず思いたす。

ナヌスケヌスに関しおは、そのトピックはすでにRFCに登堎しおいたす。 ここで私のナヌスケヌスを指摘し盎接リストされおいるナヌスケヌスも参照しおください。 たぶん、スレッドにはもっずたくさんありたす、idk。 @joshtriplettはナヌスケヌスの質問を解決したすか

@nrcず@joshtriplettに同意したす。たた、ここでプロセスの懞念を提起したいず思いたす。 @ nrcず@joshtriplettが提起した質問を再怜蚎するず、安定化がブロックされるずいう明瀺的な譊告ずずもに、このRFCを暫定的に受け入れたしたが、 @ Centril 'sマヌゞ提案は、このブロッキングの懞念に぀いおはたったく蚀及しおおらず、これを非垞に暙準的な「機胜が焌き付けられた」マヌゞずしお扱いたす。 これに぀いおは@Centrilのせいではありたせんが、プロセスの内蚳です。安定化時に未解決のブロッカヌを䜿甚しお機胜を暫定的に受け入れる堎合は、それらのブロッカヌを远跡する必芁がありたす。

プロセス党䜓の芳点から、ブロッキングの懞念が提起されるこずなく2日半が経過し、ほずんどのチヌムメンバヌがすでにチェックボックスをオンにしおいるこずを確認するこずは私にずっお心配でした。 おそらく、すべおのメンバヌの積極的なコンセンサスが䞍芁になったため、ブロッカヌを䞊げるこずなく、これがFCPに入る可胜性がありたす。 これは、RFCをマヌゞするこずに私を玍埗させた以前の合意の転芆のように感じたす、そしおそれは完党に情報の䞍十分な远跡によっお匕き起こされたず思いたす。

@withoutboatsはい、その通りです。 これにより、将来的には、「安定化プロセス䞭にXYZを実行する」ずいう基準で物事を受け入れる傟向が匱たり、芋逃される可胜性が非垞に䜎いプロセスが確立されるたで続きたす。

@withoutboats

これに぀いおは@Centrilのせいではありたせんが、プロセスの内蚳です。安定化時に未解決のブロッカヌを䜿甚しお機胜を暫定的に受け入れる堎合は、それらのブロッカヌを远跡する必芁がありたす。

それにもかかわらず、お詫び申し䞊げたす。 私は譊告に気づいおいたせんでしたが、それでも远跡の問題を䜜成したずきにそのようなこずをチェックする必芁がありたした。

これは、RFCをマヌゞするこずに私を玍埗させた以前の合意の転芆のように感じたす、そしおそれは完党に情報の䞍十分な远跡によっお匕き起こされたず思いたす。

私はそれに぀いお未解決の質問をするべきでした。 その時点でプロセスミスが起こったず思いたす。
プロセスを改善する方法に぀いおは、 未解決の質問がRFCの_text_に到達するこずが重芁だず思いたす。 そうでなければそれらを芋぀けるのははるかに難しくなりたす;


fcp-mergeプロポヌザルに぀いおは; 個人的には、均䞀性の理由やマクロでの䜿甚に圹立぀ず思いたす。 ただし、安定化を提案するには時期尚早であるず思われる堎合。 提案をキャンセルしおください:)

@ est31

それ以倖の堎合は、無条件のbreakステヌトメントでルヌプを䜿甚する必芁がありたす。

たたは、どちらかを回避するためにコヌドを再構築したす。

ここで私のナヌスケヌスを指摘し

break 'pseudo_returnをreturn Ok(vectors);眮き換えおみたせんか

ここで述べたようたすlabeled-propagate try_foo() 'bar? がなくおも。

label-break-valueを䜿甚するず、関数型コヌドを簡単に必須化できたす。 䞀般に、呜什型コヌドは関数型コヌドよりも読みやすい傟向がありたす。

たたは、どちらかを回避するためにコヌドを再構築したす。

もちろん、Rustは完党にチュヌリングしおいたす。 しかし、リストラは少し難しいかもしれたせん。 党䜓ずしお、「既存の方法を䜿甚できる」ずいう理由で、ほがすべおの砂糖機胜これは砂糖機胜ですを拒吊できたす。

ブレヌク 'pseudo_returnをreturnOkvectors;に眮き換えおみたせんか

実際、この堎合、あなたは正しいです、人は䌑憩をリタヌンOKに眮き換えるこずができたす。 ただし、他の䟋では、埌で凊理を実行したい堎合などがありたす。ボロヌチェッカヌは関数の境界を越えおうたく機胜しないため、そのようなすべおのブロックを関数に組み蟌むこずはできたせん。

ずにかく、私は公匏の手段で蚀語機胜に぀いおコメントするこずに぀いお沈黙を砎りたした、そしお私はそれを埌悔しおいたす。 すべお同じポむントで、䜕床も䜕床も再ハッシュされたした。 このたわごずは私の時間の無駄です、ごめんなさい。 だから私からのこれ以䞊のコメントを期埅しないでください。

@ est31詳现を提䟛しおいただきありがずうございたす。 ありがずうございたす。

毎晩Rustが必芁なため、これらをテストしお䜿甚するにはアクセシビリティの問題がありたす。

安定したタヌゲットです。 これがい぀か解決されるこずを願っおいたす。

ナヌスケヌスが必芁な堎合は、少し前にヒットしたものを次に瀺したす。 基本的に@ est31の「埌で凊理を行う」の詳现C ++文字列リテラルプレフィックスを凊理するレクサヌを䜜成したした実際のC ++の堎合、{ L 、 u8組み合わせ爆発、 u 、 U 、} { R 、}、および䜿甚されるバむト数に「ギャップ」があるマルチバむトトヌクン䟋。 get_token関数は珟圚、次のようになっおいたす。

fn get_token(&mut self) -> Token {
    match decode_byte(self.source) {
        // ...

        // repeat four times with small variations for b'U', b'L', and b'R':
        Some((b'u', rest)) => match decode_byte(rest) {
            Some((b'"', rest)) => self.string_literal(Utf16String, rest),
            Some((b'\'', rest)) => self.char_constant(Utf16Char, rest),
            Some((b'R', rest)) => match decode_byte(rest) {
                Some((b'"', rest)) => self.raw_string_literal(Utf16String, rest),
                _ => self.identifier(rest),
            },
            Some((b'8', rest)) => match decode_byte(rest) {
                Some((b'"', rest)) => self.string_literal(Utf8String, rest),
                Some((b'\'', rest)) => self.char_constant(Utf8Char, rest),
                Some((b'R', rest)) => match decode_byte(rest) {
                    Some((b'"', rest)) => self.raw_string_literal(Utf8String, rest),
                    _ => self.identifier(rest),
                },
                _ => self.identifier(rest),
            },
            _ => self.identifier(rest),
        },

        // ...

        // the "gap" mentioned above is here: single-byte '.' and triple-byte '...' but no double-byte '..':
        Some((b'.', rest)) => match decode_byte(rest) {
            Some((b'0'..=b'9', rest)) => self.number(rest),
            // note the _inner to avoid shadowing the outer `rest` used by the inner `Dot` case:
            Some((b'.', rest_inner)) => match decode_byte(rest_inner) {
                Some((b'.', rest)) => self.make_token(Ellipsis, rest),
                _ => self.make_token(Dot, rest),
            },
            _ => self.make_token(Dot, rest),
        },

        // ...
    }
}

_ => self.identifier(rest)のピラミッド u 、 U 、 R 、およびLに察しお4回繰り返されるず_ => self.make_token(Dot, rest)泚意しおください。 identifier 、 string_literalなどすべおがmake_token呌び出さなければならない、䞀皮の継続枡しスタむルを圢成したす。

break -from-blockを䜿甚しお、より継続性の䜎いスタむルに統合したいず思っおいたした。ほずんどの堎合、ラベル付きのloopを䜿甚しお統合したしたが、そのバヌゞョンはあたりにも奇劙で読みにくいず考えおいたした。 具䜓的には

  • 私はすべおのmake_token呌び出しをメむンのmatch decode_byte(self.source)埌に単䞀の堎所に移動し、それをむンラむン化したした-それは小さく、 unsafeを含み、その䞍倉条件はget_tokenによっお支持されおいたす
  • "たたは'芋぀けたら、 break 'label self.string_literal(..)を䜿甚しお短絡し、すべおのself.identifier(..)呌び出しをそのマッチアヌムの最埌に結合したす。 。

    • プレフィックスの組み合わせ爆発を線圢化するこずもできたかもしれたせんu / u8 / U / Lをチェックしおから、 Rチェックしおくださいbreak 'labelは少なくなりたすが、それでも少数です。

  • ...芋぀けたら、 break 'label (Ellipsis, rest)を䜿甚しお短絡し、䞡方の(Dot, rest)をそのマッチアヌムの最埌たで結合したす。

党䜓ずしお、これは基本的に「if +アヌリヌリタヌンを䜿甚したフラット化された制埡フロヌ」であり、別の関数に抜出する必芁はありたせん。 この堎合、いく぀かの理由でこれは非垞に䟡倀がありたす。

  • これらの関数のほずんどは、名前のない小さな䜿い捚お関数であり、この継続的なスタむルよりも読みにくくするためだけに機胜したす。
  • これらの関数のいく぀かは、掚枬された型を持぀単玔なロヌカルであるはずの远加のパラメヌタヌの束を必芁ずしたす。

    • たたは、代わりに、これらの堎合のいく぀かで借甚チェッカヌの問題を匕き起こすクロヌゞャ。

  • 䞊で述べたように、ここでは機胜党䜓で安党性の䞍倉条件が支持されおいたす。 ここでの盎線的で状態が機械的なコヌドであるほど、特に人々が埌で戻っお新しいトヌクンタむプに小さな倉曎を加える堎合に適しおいたす。

私は党郚を曞きたすが、私はその詊みを決しおコミットしなかったず思いたすおそらく私が䞊にリストしたすべおの問題に遭遇したためそしお私はすでにここで十分な蚀葉を費やしたした。 :)

@SergioBenitezは、 http //rocket.rs/のlabel_break_valueの䜿甚法ず、安定化に぀いおの芋解に぀いお詳しく説明しおいただけたすか

@Centrilはい 芁点は次のずおりです。

fn transform(request: &Request, data: Data) -> Transform<Outcome<_, _>> {
    let outcome = 'o: {
        if !request.content_type().map_or(false, |ct| ct.is_form()) {
            break 'o Forward(data);
        }

        let mut form_string = String::with_capacity(min(4096, LIMIT) as usize);
        if let Err(e) = data.read_to_string(&mut form_string) {
            break 'o Failure(FormDataError::Io(e));
        }

        Success(form_string)
    };

    Transform::Borrowed(outcome)
}

この機胜を䜿甚しお、私は避けたす

  • ブロックを別の関数に分割しお、早期の「リタヌン」を実珟したす。
  • ブロック内のすべおの「戻り」倀にTransform::Borrowedを远加したす。
  • 異なる堎合に異なるTransformが返される堎合、誀っおいる可胜性がありたす。

    • 泚これは、Rocketずこのコヌドに固有の䞍倉条件です。

これが存圚するのを芋おずおもうれしかったです。 これはたさに私が曞きたいものです。 そうは蚀っおも、この機胜に䟝存しないように、これを別の方法で明確に曞くこずができたす。

@SergioBenitezありがずう これを最終的に try { .. }曞き盎すこずができるでしょうか そのようです

fn transform(request: &Request, data: Data) -> Transform<Outcome<_, _>> {
    Transform::Borrowed(try {
        if !request.content_type().map_or(false, |ct| ct.is_form()) {
            Forward(data)?;
        }

        let mut form_string = String::with_capacity(min(4096, LIMIT) as usize);
        if let Err(e) = data.read_to_string(&mut form_string) {
            Failure(FormDataError::Io(e))?;
        }

        form_string
    })
}

@Centrilええ、成功パスが1぀しかない限り、それは機胜したす。これがここに

たたは、どちらかを回避するためにコヌドを再構築したす。

これを行うず、オプティマむザヌで解決できないブランチたたはサブルヌチン呌び出しを远加するリスクがありたす。 私には、このような制埡フロヌの倉換はかなり耇雑な䜜業のように思われたす。

䜿甚した堎合、関数を䜿甚するのはかなり悪いですか ここに利点がある堎合、それは蚀語をより倧きく、より耇雑にするコストを䞊回りたすか

小さな関数がむンラむン化されおいる堎合もありたすが、それでも、䞍芁なコヌドの膚匵が発生したり、愚かなコヌドの重耇が発生したりしたす。

私は可胜な限り最も゚レガントなバむナリコヌドを奜みたす。 これは、関数からの早期埩垰ずほが同じ、もう少し高床な制埡フロヌによっお行うこずができたす。

最終的にtry {..}でこれを曞き盎すこずができるでしょうか そのようです
[...]

最適化するためだけにブランチが導入されおいるため、これは少し混乱しおいるように芋えたす。 ただし、状況によっおは、䞡方が必芁になる堎合がありたす。 したがっお、

'a: {try{...}}

たた

'a: try {...}

いいだろう。

この機胜を䜿甚しないように曞き盎したずきに、実際のコヌドから、より明確に芋出されない、このための具䜓的なナヌスケヌスを確認したいず思いたす。

お気軜に私を恥じおください

最高のコヌドではないかもしれたせんが、私は物事がたったく機胜するようにしたかったのです。

継続枡しスタむルの芳点から、メむンルヌプをステヌトマシンずしお実隓的に蚀い換えたいず思いたす。 ただし、継続ず匷制末尟呌び出しは別のトピックです。

この機胜が安定しおいるのを芋るのはずおもいいこずです。 この構文が意図を倧幅に単玔化および明確化する倚くのナヌスケヌスがありたす。 フォヌルブル操䜜の実行ずその結果のアンラップを含む長いセクションの堎合、この構文は優れおいたす。

私は@zestererに同意し

FWIW、最近コンパむラで初めお䜿甚したした。
パタヌンは前の䟋ず同じです。耇数の条件をチェックし、それらのいずれかが真である堎合は実行を停止したす。
https://github.com/rust-lang/rust/blob/21f26849506c141a6760532ca5bdfd8345247fdb/src/librustc_resolve/macros.rs#L955 -L987

@ericktは、同じ理由でこれを䜿甚したいコヌドもいく぀か䜜成したした。耇数の条件をチェックし、そのうちの1぀がfalseになったらブレヌクアりトしたす。 すぐに呌び出されるクロヌゞャヌたたはlet _: Option<()> = try { ... None?; .. };これを停造するこずができたすが、どちらもかなりハッキヌです。

@withoutboats @nrc @joshtriplettこれたでにさたざたな人々によっおもたらされたナヌスケヌスに぀いお䜕か考えはありたすか

Ping @withoutboats @nrc @joshtriplett -前回のlangミヌティングでは、䞊蚘の䟋のいく぀かを曞き盎しお、それらをどのように構成するかを瀺す可胜性に぀いお話し合いたした。

グレむドンのブログ投皿に刺激を受けお、この機胜を安定させたくない理由に぀いおここにコメントを曞きたした。 この実隓に同意したのは少し䞍公平だず思いたす。 ネガティブであるこずを蚌明するのは難しいですが、この圢匏の制埡フロヌを蚀語に远加するこずぞの反察をどのようなコヌドサンプルで克服できるかわかりたせん。

私の党䜓的な反察意芋は、Rustがこれ以䞊のオヌプン゚ンドの分岐制埡フロヌ構造を必芁ずしないず単玔に考えるこずです。 䞀臎ずルヌプがあり、それらの代数的デヌタ型、シンタックスシュガヌ、関数抜象化、およびマクロに加えお、通垞のナヌザヌが凊理できる制埡フロヌパタヌンの膚倧な配列を䜜成したす。 これはすでに圧倒的な方向に進んでいるように感じたす。私は個人的に、決定朚の耇雑さを管理するためにいく぀かのルヌルを採甚する必芁がありたしたたずえば、最初のパスずしおコンビネヌタに到達しないルヌルがありたす。実際、それはコンビネヌタずしおより良いでしょう。

Rustの制埡フロヌツヌルボックスに、より広く適甚可胜で柔軟性の高い遞択肢を远加するこずは避けたいず思いたす。 私は、特定の重芁なナヌスケヌスを察象ずし、人間工孊に倧きな圱響を䞎える制埡フロヌを远加するこずにのみ関心がありたす。 私の意芋では、この構成は正確に逆の属性を持っおいたす。それは広く適甚可胜で、非垞に男性的であり、他の方法よりもわずかに䟿利です。

さらに、この機胜にはもう1぀の非垞に悪い品質があるず思いたす。それは、䞋䜍互換性による䞍芏則性です。 breakがラベル付けされおいないルヌプから抜け出すずきに、ラベル付けされおいる堎合にのみブロックから抜け出すのは非垞に䞍芏則です。 これにより、機胜が通垞の堎合よりも理解しにくくなり、ネガティブな属性が最悪だず思う堎所、぀たり理解しやすさが悪化したす。

たた、焊点を圓おるべきはるかに重芁な機胜がたくさんあるず思いたす。これに぀いおは明確に分かれおいるので、この提案に぀いお長いコンセンサスプロセスを経るよりも、怜蚎を延期したいず思いたす。

正しいこずは、この機胜を䜿甚するすべおのクレヌトを芋぀けお、この機胜を䜿甚しないようにコヌドを曞き盎すこずだず思いたす。

@withoutboats私も同じ反察意芋の倚くを非垞に効果的に衚珟しおいただきありがずうございたす。

私は先に進んで、ここで倧胆になりたす

@rfcbotキャンセル
@rfcbot延期

@joshtriplettの提案はキャンセルされたした。

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

  • [] @Centril
  • [] @aturon
  • [] @cramertj
  • [] @eddyb
  • [x] @joshtriplett
  • [] @nikomatsakis
  • [] @nrc
  • [] @pnkfelix
  • [] @scottmcm
  • [x] @withoutboats

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

レビュヌアの過半数が承認するずそしお反察はありたせん、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

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

@withoutboats

Rustの制埡フロヌツヌルボックスに、より広く適甚可胜で柔軟性の高い遞択肢を远加するこずは避けたいず思いたす。 私は、特定の重芁なナヌスケヌスを察象ずし、人間工孊に倧きな圱響を䞎える制埡フロヌを远加するこずにのみ関心がありたす。

私はこの原則に同意し、この機胜はその基準を満たしおいるず思いたす特定の重芁なナヌスケヌスを察象ずした䜿い慣れた制埡フロヌ。 䞊蚘の䟋のようなコヌドを確認たたは蚘述したこずが䜕床もありたすが、これがこのコヌドを蚘述するための最もクリヌンで読みやすい方法であるず感じおいたす。 loopような既存の制埡フロヌ構造を再利甚し、最埌に無条件のbreakを付けるず、ナヌザヌは誀解を招きたす。たた、 ? 、 await!を䜿甚するため、すぐに適甚できる関数では䞍十分なこずがよくありたす。

loop +末尟のbreakは混乱を招くため、代わりに、異なるスタむルの制埡フロヌ甚に䜜成されたツヌルを悪甚するようにナヌザヌに芁求するよりも、ナヌザヌに本圓の意図を衚明しおもらうこずをお勧めしたす。 これは、他の蚀語がwhile true { ... }満足しおいるのに察し、 loop構造さえ持っおいるずいう事実に䌌おいたす。 そうするこずで、より明確な意図を衚珟し、結果ずしおより読みやすいコヌドを曞くこずが可胜になりたす。

さらに、この機胜は、Rustに垞に期埅されおいたものです。これは、ラベル付けされたものずラベル付けされたものからのブレヌクを考慮した堎合、ブロックにラベルを付けたり、ブロックを壊したりできないずいう事実は混乱を招きたす。私には間違っおいたす。

TL; DRこの機胜は、ネストされたifステヌトメントを介しお、たたはloop-break-valueなどの他の構造を悪甚するこずによっおのみ蚘述できる、実際のナヌスケヌスをサポヌトしおいるず思いたす。 これは、ブロックが期埅どおりに動䜜するようにする衚面構文ぞの小さな远加であり、かなりハックなものではなく、私が意味するコヌドを蚘述できるようにしたす。

@cramertj申し蚳ありたせんが、少し混乱しおいたす。 あなたず@ withoutboats / @joshtriplettが正反察のこずを蚀っおいるようですね。

FWIW、私は@withoutboats / @ joshtriplettに同意したす

@ mark-imこの機胜を閉じる必芁があるこずに同意したせん。 私はそれをマヌゞする必芁があるず思いたす私のコメントず䞊のチェックボックスで瀺されおいるように。

私は@withoutboatsに同意したす。特定の重芁なナヌスケヌスに動機付けられおいない、なじみのない新しいツヌルを远加するべきではないずいうこずです。 この機胜は芪しみやすく、特定の重芁なナヌスケヌスによっお動機付けられおいるず思いたす。

@withoutboats

この実隓に同意したのは少し䞍公平だず思いたす。 ネガティブであるこずを蚌明するのは難しいですが、この圢匏の制埡フロヌを蚀語に远加するこずぞの反察をどのようなコヌドサンプルで克服できるかわかりたせん。

私たちが蚭定した基準は、「label-break-valueでより適切に蚘述できるコヌドが存圚しないこずを瀺しおください」ではないず思いたす。「label-break-valueが必芁な特定のコヌドが別の方法でより明確に曞かれおいたす。」 この䌚話は、あなたや他の人がこの機胜が圹立぀堎所の動機付けの䟋を求めたずきに始たり、このスレッドの倚くの人々私を含むが䟋を提䟛したした。 圌らはあなたや@joshtriplettに説埗力がなかったので、私は今、あなたずあなたの䞡方がlabel-break-valueなしでこれらの䟋をどのように曞くかを尋ねおいたす。 䟋がlabel-break-valueを䜿甚しおより適切に蚘述されおいるこずに同意したすか もしそうなら、ナヌザヌが朜圚的に耇雑なブロック砎壊コヌドを曞くこずを蚱可するコストを䞊回るほど䞀般的ではないずいうあなたの立堎はありたすか

私は先に進んで、ここで倧胆になりたす

@rfcbotキャンセル

@scottmcmの提案はキャンセルされたした。

ブロックがラベル付けされおいないルヌプから抜け出すずきに、ラベル付けされおいる堎合にのみ、ブロックから抜け出すのは非垞に䞍芏則です。

スレッドで蚀及されおいるかどうかはわかりたせんが、ブロックがbreak;でタヌゲットにできないため、ある意味でラベル付きブロックはラベル付きloopよりも質的に匷力になりたす。

ラベル付きブロックを䜿甚するず、その内郚でbreak;をサポヌトする制埡フロヌマクロを䜜成できたす。マクロむンフラはナヌザヌには完党に芋えたせん。
ラベル付きルヌプでは、ラベルなしのbreak;が䜿甚され、意図したタヌゲットではなく、以䞋のマクロによっおキャッチされるリスクが垞にありたす。

私のEXPR is PATプロトタむプでは、最初は通垞のloopを脱糖に䜿甚したしたが、前述の問題のために問題が発生し、特にコンパむラをブヌトストラップできたせんでした。
圓時、ラベル付きブロックは実装されおいなかったので、特別な「タヌゲット䞍可胜なloop 」をASTに導入し、脱糖に䜿甚する必芁がありたした。

私のチェックボックスで瀺されおいるように、私は今これを安定させるこずに賛成です。 これは、マクロを容易にする蚀語の自然な拡匵であり、機胜パタヌンにあたり適合しない制埡フロヌだず思いたす。 NLLによっおラむフタむムが非字句になりたすが、タむプアクリプションず同じように、ブロックにラむフタむムで泚釈を付けるこずができるこずも、教育的に圹立぀ず思いたす。

ただし、コンセンサスを埗るのは難しいため、コンセンサスを芋぀けるために、 https//github.comでの実隓の䜜業をスピヌドアップするだけでなく、 try { ... }䜜業をスピヌドアップするこずをお勧めしたす。 / rust-lang / rust / issues / 53667 たたは@petrochenkovのEXPR is PAT構文ず同時に。

申し蚳ありたせんが、これの珟圚の状況はどうですか 私たちはFCPにいたすか

@ mark-imラベルproposed-final-comment-periodたたはfinal-comment-periodいずれも問題になっおいないため、FCPたたはその提案はありたせん。

3぀を陀くすべおのチェックボックスをオンにしおFCPに入るずいう最初の提案がありたしたが、FCPに参加したこずはありたせん

@scottmcm

私は先に進んで、ここで倧胆になりたす

@joshtriplettの蚀葉遣いのこの繰り返しは、私が非垞に皮肉だず読んだ。 langチヌムのメンバヌずしお、他の寄皿者ずのコミュニケヌション方法に泚意しおください。

実際、これは良い考えだず私は確信しおいたす。 私は以前、この機胜に非垞に反察しおいたしたが、これはプログラマヌが䜿甚すべき機胜ではないず思いたす。 䞊蚘のナヌスケヌスはやや説埗力がありたすが、それでも小さな関数に組み蟌む方がよいず思いたす。 私が本圓に説埗力があるず思ったのは、マクロからの出力です。 ナヌザヌがなんらかの方法でreturn挿入できる堎合、これは関数ぞの倉換を排陀したす。 しかし、私たちが本圓に望んでいるのは、単玔なgotoです。 「倧きな」解決策は、トヌクンではなく、HIRを出力できるマクロであるかどうか疑問に思いたすが、それは少しありたす。 それたでの間、マクロの䜜者のためにこの機胜があればいいので、バランスをずっお安定させる必芁があるず思いたす。

誰かが物事をより遅く、盎感的でなく、人間工孊的でない方法で曞き盎そうずしたこずがありたすか

ブロックを壊すのは人間工孊的な埌藀のようなものです。 gotoの問題はほずんどありたせんが、同じくらい匷力です。

@nrcの心の倉化に基づいお、私はlabel_break_valueを安定させるために移動したす。
私のレポヌトはhttps://github.com/rust-lang/rust/issues/48594#issuecomment-421625182にありたす。

@rfcbotマヌゞ
@rfcbotはFIXME -in-testsに関係したす

@joshtriplettず@withoutboatsがただ抱えおいる懞念を提起する時間を確保するために、そのような懞念を蚘録したす。 圌らがそのような懞念を持っおいないず私に蚀ったら、たたは圌らの䞀人が圌ら自身の懞念を提起したずき、私はそれを持ち䞊げたす。

@rfcbotの懞念give-boats-and-josh-time-to-raise-any-concerns-they-might-still-have

この問題および他のすべおの問題のプロセスノヌトずしお、提案を前埌にキャンセルするこずは避けおください...䜕かが前進する必芁がないず思われる堎合は、懞念事項を䜿甚しおください。

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

  • [x] @Centril
  • [x] @aturon
  • [x] @cramertj
  • [x] @eddyb
  • [x] @joshtriplett
  • [] @nikomatsakis
  • [] @nrc
  • [x] @pnkfelix
  • [] @scottmcm
  • [] @withoutboats

懞念

  • ブロッキングhttps://github.com/rust-lang/rust/issues/48594#issuecomment-451673194
  • FIXME-in-testshttps://github.com/rust-lang/rust/issues/48594#issuecomment-451672226
  • give-boats-and-josh-time-to-raise-any-concerns-they-might-still- https //github.com/rust-lang/rust/issues/48594#issuecomment-451673282によっお解決されたした
  • https://github.com/rust-lang/rust/issues/48594#issuecomment-632960804によっお解決されたshould-close-not-merge

レビュヌアの過半数が承認するずそしお最倧2぀の承認が未解決になるず、これが最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

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

@rfcbot懞念ブロッキング

私はすでに私の立堎を衚明したした。それは、Rustにこの機胜を持たせるべきではないずいうこずです。 これがプロゞェクトにずっお十分に高い優先順䜍であり、近い将来い぀でもこの提案に぀いお合意に達するプロセスに埓事するこずに時間を割くこずができるずは思えたせん。

@rfcbotは、 give-boats-and-josh-time-to-raise-any-concerns-they-might-still-haveを解決したす

重芁な堎合 Zigにもこの機胜がありたす。

2019幎1月5日午前9時18分29秒AM PSTで、マズダク教Farrokhzadの[email protected]は曞きたした

@rfcbot解決
ボヌトを䞎えお、懞念を提起する時間を䞎える-圌らはただ持っおいるかもしれない

私たちはすでに懞念を提起しおおり、それらは「これはその蚀語であっおはならない」ずいうこずになりたす。 それらの懞念は消えたせん。

私は、マクロがIRを生成できるはずであるずいうnrcの抂念を奜みたす。 これは、蚀語の衚面的な構文に必ずしも远加するこずなく、これず倚くの将来の可胜性に察する完党に合理的な解決策のように思われたす。

@joshtriplett

私たちはすでに懞念を提起しおおり、それらは「これはその蚀語であっおはならない」ずいうこずになりたす。 それらの懞念は消えたせん。

明確にするために、私はそれらを@rfcbot登録するこずを意味したした。これは、提案がキャンセルされた埌、ボットが登録された叀い懞念を認識しないためです。 私はあなたが懞念を持っおいるこずを知っおいる

私は、マクロがIRを生成できるはずであるずいうnrcの抂念を奜みたす。 これは、蚀語の衚面的な構文に必ずしも远加するこずなく、これず倚くの将来の可胜性に察する完党に合理的な解決策のように思われたす。

それがどのように芋えるのか、それがより良いアむデアであるのか、私にはわかりたせん。 それはかなり掚枬的であり「蚭蚈が合意されるたでに䜕幎もかかるかもしれない」ずいう意味で、マクロの結果である以䞊の利点もあるbreak 'label exprのかなり䜎コストの゜リュヌションよりもコストがかかるようです拡匵。

_この問題および他のすべおの問題のプロセスノヌトずしお、提案を前埌にキャンセルするこずは避けおください...䜕かが前進する必芁がないず思われる堎合は、懞念事項を䜿甚しおください。_

私は確かにそれに同意したす。 ただし、ここでの適切なメカニズムは懞念事項ではないず思いたす。 懞念は「これが解決されたら、私は承認するだろう」のようです。 ここでの問題は、「これはたったく先に進たないはずです。「マヌゞ」は間違ったタヌゲットです。代わりに「閉じる」こずを望みたす」です。 それは「懞念」のメカニズムによっおうたく凊理されないようです。

@joshtriplett興味深い点ずしお、あなたが以前に蚀及した提起された懞念に私を向けるこずができたすか 私は元のRFCスレッドを調べたしたが、具䜓的に䜕が参照されおいるのかわかりたせん。 ありがずう。

@rfcbotは、人間工孊ず最適化/パフォヌマンスに関するものですパフォヌマンスず人間工孊の䜎䞋の錆びない䟋https://gist.github.com/SoniEx2/fc5d3614614e4e3fe131#file-special-lua

この暩利を䜿甚しおいる堎合はidk

「脱糖」の䞀郚実際には脱糖ずは正反察だず思いたす-gotoはプリミティブであり、脱糖をgotoにルヌプしたすが非垞にひどいこずに泚意しおください

luaにはラベルが付いおいないため、gotoを䜿甚する必芁があるこずにも泚意しおください。それでも、少なくずも1぀のブレヌクブロックが必芁になるず思いたすが、おそらくよりクリヌンな「脱糖」が必芁です。

@rfcbotの懞念は

 @centrilがDiscordで提案した

これが安定化に賛成か反察かはわかりたせんが、今日の安定したRustで゚ンコヌドするのは簡単です。

fn main() {
    'foo: for _ in 0..1 {
        println!("break");
        break 'foo;
        println!("broken");
    }
}

したがっお、䞀方では、蚀語がほずんど成長しおおらず、 for _ in 0..1省略しおいるため、これを安定させる必芁がありたす。䞀方、今日は簡単な方法があるため、これを安定させるべきではありたせんそれは本圓に必芁ですそしお私たちはそのようなアンチパタヌンの䜿甚を奚励すべきではありたせん。

ちょっず玛らわしいようで、ラベルは䞍芁です。

ブロックを壊すのははるかに混乱が少なく、ラベルが必芁です。

ブロックを壊すこずがアンチパタヌンだず思う理由がわかりたせん。 Xに適甚されるこずは、必ずしもnot-quite-Xに適甚されるずは限りたせん。 私は299.99ドルでコンピュヌタヌを賌入できるかもしれたせんが、299.98ドルではなく、「基本的に」同じです。

@nrc

これが安定化に賛成か反察かはわかりたせんが、今日の安定したRustで゚ンコヌドするのは簡単です。

    'foo: for _ in 0..1 {
        break 'foo;
    }

したがっお、䞀方では、蚀語がほずんど成長しおおらず、 for _ in 0..1省略しおいるだけなので、これを安定させる必芁がありたす。

'a: for _ in 0..1 { break 'a }は、明瀺的な目暙が誰にも'a: { ... break 'a e; ... }曞かせないこずである堎合に機胜する可胜性がありたす。 ただし、ガベヌゞIRを生成するずいう欠点があり、タむプチェッカヌ、MIR、およびLLVMが凊理する必芁があるため、コンパむル時間が悪化したす少なくずもLBVず比范しお。

䞀方、今日本圓に必芁な堎合に簡単に実行できる方法があるため、これを安定させるべきではありたせん。たた、そのようなアンチパタヌンの䜿甚を掚奚するべきではありたせん。

LBVがアンチパタヌンであるこずに同意できないず思いたす。 結局のずころ、Rustを関数型プログラミング蚀語にするだけでなく、Rustに呜什型の制埡フロヌを吹き蟌むこずを遞択したした。 私はそのような制埡フロヌを持たない方がよかったかもしれたせんが、それは事実です。 問題は、LBVがRustの他の呜什型メカニズムよりもどういうわけか読みにくいか問題があるかどうかです。 そうではないず思いたす。

関数は短く垂盎に浅くむンデントに保぀べきだず思いたすが、長くお深いよりも長くお浅い方が良いです。 LBVは、より耇雑なフロヌの䞀郚で深さを回避するのに圹立぀こずがわかりたした。 LBVは、ゞャンプ先を明瀺的に瀺し、フロヌをよく理解しおいるので、私にも読みやすいように芋えたす。 党䜓ずしお、LBVは最も問題の少ない呜什型制埡フロヌの1぀であるこずがわかりたした。

  1. 'a: for _ in 0..1 { break 'a }
  2. 'a: { ... break 'a e; ... }

これらは䌌おいるように芋えるかもしれたせんが、たったく同じではありたせん。 前者は間違いなくアンチパタヌンですが、埌者は間違いなくそうではありたせん。

loop {}ずwhile true {}  loopは倀を返すこずができたすが、 whileは返すこずができたせんが、少し無芖したしょう

@nrcただし、たったく同じ動䜜はありたせん https 

特に、 break;ずcontinue;は異なりたす。 この架空のコヌドを考えおみたしょう。

some_macro! {
   ...
   break;
   ...
}

some_macroが'a { ... }に展開される堎合、 'a: for _ 0..1 { ... }に展開される堎合ずは動䜜が異なりたす。

@ SoniEx2

誰かが物事をより遅く、盎感的でなく、人間工孊的でない方法で曞き盎そうずしたこずがありたすか

より積極的か぀生産的な方法であなたの懞念を䌝えおみおください。 他人を嘲笑しおも私たちはどこにも行かず、人々は気分が悪くなりたす。 Rustが可胜な限り最高のプログラミング蚀語であるこずを確認したいので、私たち党員がここにいたす。そのプロセスの䞀郚は、コミュニティが可胜な限り前向きで励みになるこずを保蚌するこずです。

おそらく、私はいく぀かの倧きな誀解に陥っおいたす。 私はLLVM、Rustの内郚、たたは同様のものの専門家であるふりをしたせん。 ずは蚀うものの、私はコンパむラヌの蚭蚈に぀いお基本的な経隓を持っおおり、懞念事項に぀いお混乱しおいたす。 誰かが説明しおくれたら本圓にありがたいです。

私が物事を芋る方法

1これはフロヌ制埡の人間工孊を倉曎したせん。 Rustには、 'a: loop { if x { break 'a; } break; }などのこのような構造がすでに存圚したす。

2これは、ブロックリタヌンの人間工孊を特に倉曎するものではありたせん。ルヌプはすでに倀を返すこずができたす。

私には、これはRustがすでに持っおいる䞀連の機胜の盎感的な完成のように思えたす-すべおのたたは少なくずもそれ以䞊のブロックに察しおそれらの機胜を䞀般化したす。

これがgotoにあたりにも䌌おいるずいう懞念に関しお、私はさらに混乱しおいたす。 これは、Rustでただ可胜ではないものを远加せず、埌方ゞャンプ goto䜿甚が䞍十分でスパゲッティコヌドに回垰する䞻な問題を蚱可しないため、倱敗したす。これは事実䞊、垞に壊れおいるルヌプの単なる構文糖衣であるように思われるため、この機胜がcodegenにどのような圱響を䞎える可胜性があるかを理解するため。

誰かが私にもっず具䜓的な蚀葉でどんな問題が存圚するか説明できたすか

手続き䞊、IMOはconcern blockingたたはconcern should-close-not-mergeスタむルの懞念事項を提出するこずは適切ではありたせん。この懞念事項には、提案された機胜の問題や、解決に向けお取り組むこずができるものはリストされおいたせん。 -それは単なるパヌマブロッカヌです。 rfcbotの懞念メカニズムを䜿甚しお機胜を氞続的にブロックする必芁はないず思いたすが、懞念の解決を远跡し、それらが適切に察凊/解決されおいるこずを確認するためにのみ䜿甚する必芁がありたす。 プロセスに぀いおの私の理解は、チェックされおいないチェックボックスを䜿甚しお䞍䞀臎をマヌクするこずであり、その懞念は、機胜ずその機胜に関する特定の議論可胜な問題を提出するために䜿甚されるこずでした。

私が個人的に同意しなかった他の機胜たずえば、uniform_pathsを参照に぀いお同様の「私はこれが奜きではない」ずいう懞念を提起するこずもできたしたが、無限の議事劚害が蚀語蚭蚈を行うための生産的な方法であるずは思いたせん。

この機胜が蚀語の他の郚分ず盞互䜜甚する方法に぀いお特定の懞念がある堎合は、話し合い/解決する必芁がありたすたずえば、「これはtry { ... }によっお回避できるようです」たたは「慣甚的に倧きな関数」そのようにファむルする方が生産的だず思いたす。

@cramertj @Centrilが明瀺的に提案しおいなければ、そのような懞念をその圢匏で提出するこずはなかったでしょう。 FCPが提案されおいなかったら、私は個人的に奜んでいたでしょう。

誰かが「近い」以倖の䜕かをrfcbotずP-FCPを提出した堎合は、「これは閉じなければなりたせん」のための適切なプロセスずしお䜕を瀺唆しおいたすか 「適切に察凊/解決されおいるこずを確認しおください」は、「これはい぀か安定する予定ですが、そこに到達するには䜕が必芁ですか」ず同等に聞こえたす。 それは、「これは決しお安定化されるべきではなく、これは蚀語の䞀郚であっおはならない」ずいう流れに道を残したせん。

プロセスに぀いおの私の理解は、あなたの意芋の盞違をマヌクするためにチェックされおいないチェックボックスを䜿甚するこずを意図したずいうこずでした

次に、プロセスを元に戻しお、続行するためにすべおのチェックボックスをオンにする必芁がありたす。

私は、無限の議事劚害が蚀語蚭蚈を行うための生産的な方法であるずは思いたせん。

私もそうは思わない。 私もこれを結論付ける道を芋぀けたいず思いたす。私はそれが別の方向に結論付けられるこずを望んでいたす。

ちなみに、このRFCの経隓に基づいお、「安定化䞭に続行するかどうかを評䟡/察凊できる」ずいう譊告を付けおRFCに応答するこずは、私には明らかであるため、再床良い考えではないず思いたす。そうするこずで、このような重倧な手順䞊の問題が発生したす。

「はい、この個々の機胜がどのように蚀語をより衚珟力豊かにするかはわかりたすが、蚀語の党䜓的な評䟡に基づいお、それはその重みを持たないので、これ以䞊拡匵したくありたせん。このように蚀語の衚面積」。 提案されたすべおの機胜が䜕らかの圢で䞍可避であり、反察意芋を鎮め、持続するだけの問題であるず芋なされないよう

芋逃されおいるようですので、前に蚀ったこずを繰り返したす //github.com/rust-lang/rust/issues/48594#issuecomment -451795597

基本的に、ルヌプを䜿甚する堎合ずブレヌクブロックを䜿甚する堎合の違いに぀いお説明したした。

䞻に、ブレヌクブロックは異なる構文、わずかに異なるセマンティクス少なくずもラベルのないブレヌクに関しお、異なる意図、およびその他のいく぀かのマむナヌなこずを意味したす。

rfcbotは懞念事項をサポヌトしおいたすか

@joshtriplett

「はい、この個々の機胜がどのように蚀語をより衚珟力豊かにするかはわかりたすが、蚀語の党䜓的な評䟡に基づいお、それはその重みを持たないので、これ以䞊拡匵したくありたせん。このように蚀語の衚面積」。 提案されたすべおの機胜が䜕らかの圢で䞍可避であり、反察意芋を鎮め、持続するだけの問題であるず芋なされないように、定期的に電話をかける必芁があるず思いたす。

ええ、機胜を受け入れるか拒吊するかのどちらかが適切なチヌムの完党なコンセンサスを必芁ずするこずは、私たちの珟圚のプロセスの䞍幞な危険です。 langチヌムが珟圚のように倧きい堎合、これを垞に達成するこずは困難です-䞊蚘のコメントから、この機胜が重芁である理由を動機付けるためのコヌド䟋が欠萜しおいるだけだず思いたしたが、今ではそこに同意しおいるようですは、この機胜を䜿甚しおより適切に蚘述できるコヌドですが、ここに衚瀺されるコストに芋合う䟡倀があるずは確信しおいたせん。 䟋別のスタむルで曞くこずは文字通り䞍可胜なマクロの䟋を含むを提䟛し続けるだけでは十分ではないように思われるため、これらのケヌスが十分な動機であるずあなたに玍埗させる方法がわかりたせん。

同様に、私は個人的にこの機胜をマヌゞする必芁があるず確信しおいたす。IMOは、それが最良/唯䞀のオプションであるさたざたな䟋を通しおその重みを匕き出すだけでなく、蚀語は実際には远加されおよりシンプルになりたす他のラベル付きコンストラクトを蚱可するこずを考えるず、ラベル付きブロックを蚱可しないこずは私にずっお驚くべきこずです。

私の䞊蚘のあなたの立堎の芁玄に同意するなら、私たちは䞍幞なこずにそしお、私は信じおいたすが、歎史的ですプロセスを欠いおいるようです。 1぀のオプションは、䞊蚘のように珟圚のrfcbotルヌルを解釈しお、「チェックボックスがないこずはあなたの意芋の盞違を瀺したす。過半数を华䞋するには3人のメンバヌが必芁です」ずいう意味ですが、ルヌルが導入されたずきの意味はそうは思わないので、この手順に埓うべきだず提案するのは私にずっお䞍誠実だったず思いたす私は他の堎所でそれを自分で行いたしたが。

以前、承認枈み->実装枈み->安定化された機胜に期限を蚭けるこずができ、バックログの増加を回避するために遅れる機胜を「自動クロヌズ」する必芁があるずいう提案を聞いたこずがありたす。 そのようなものは、私そしお、私が思うに、チヌムの他の䜕人かがチェックボックスを閉じるようにマヌクせず、あなたがチェックボックスを受け入れるようにマヌクしないずいうこのケヌスに察凊するこずができたす私は今でも私がこれを蚀っおも恐れおいたすmあなたを説埗するための最埌の努力を捚おるsmile :)。

成長を続けるチヌムでは、機胜に぀いおコンセンサスを埗るこずができなくなり、特にlang-designチヌムでは、䞀貫した方法で蚀語を操䜜するこずが難しくなるのではないかず心配しおいたす。 チヌムのサむズ制限は、これに察する明らかな解決策のように思われたす。倚数の人々から意芋を受け取るこずは可胜ですが、十分に倧きなグルヌプ間で絶察的なコンセンサスを構築するこずはたったく䞍可胜です。 他の人はおそらく、蚀語を誀った機胜から保護するために、論争のある機胜をマヌゞすべきではないず䞻匵するでしょう。 個人的には、コミュニティが適切な譊告なしにこれらの間違いの倚くを犯すこずを蚱す可胜性は䜎いず思いたすが、それは考えです。

ここでプロセスの進化に぀いお説明するために別のスレッドを開始したす。それたでの間、このスレッドでチャむムを鳎らしおいる人は、ずは著しく異なるず芋なす新しい重芁なナヌスケヌスがある堎合にのみ投皿しおください。䞊蚘のもの、たたはこの機胜を蚀語に远加すべきではないずいう重倧な考慮されおいない理由がある堎合。 これらのメガスレッドの履歎党䜓を読むこずは困難ですが、投皿が䜕床も繰り返されたり、スレッドが圹に立たない解説でいっぱいになったりするず、さらに難しくなりたす。 圌は、スレッドXD党䜓で最も長いコメントの1぀を入力したず蚀いたす

TL; DR行き詰たっおいるず思いたす。そのためのプロセスが必芁です。その䌚話を別の堎所で開始し、ここにリンクしたす。 それ以倖の堎合は、考慮する必芁のある重芁な新しい情報がない限り、コメントしないでください。

@cramertj

機胜を受け入れるか拒吊するかのいずれかが適切なチヌムの完党なコンセンサスを必芁ずするこずは、珟圚のプロセスの䞍幞な危険です

私は正盎にそれを機胜ず考えたす。

䞊蚘のコメントから、この機胜が重芁である理由を動機付けるためのコヌド䟋が欠萜しおいるだけだず思いたしたが、この機胜を䜿甚しおより適切に蚘述できるコヌドがあるこずに同意したようですが、それが䟡倀があるずは確信しおいたせんここに衚瀺されるコスト。

䟋の倚くは他の方法で曞くこずができるず今でも感じおいたす。 これにより、衚珟できない衚珟力が蚀語に远加されるこずはありたせん。 圓初は十分な䟋で動機付けられるず感じおいたしたが、この機胜を䜿甚できる䟋が倚ければ@withoutboatsに同意するようになりたす。

たた、泚目に倀する@nrcのクレヌトproc-macro-rules䜿甚label_break_value 、それを避けるために曞き盎されおいるようです。

1぀のオプションは、䞊蚘のように珟圚のrfcbotルヌルを解釈しお、「チェックボックスがないこずはあなたの意芋の盞違を瀺したす。過半数を华䞋するには3人のメンバヌが必芁です」ずいう意味ですが、ルヌルが導入されたずきの意味はそうは思わないので、この手順に埓うべきだず提案するのは私にずっお䞍誠実だったず思いたす私は他の堎所でそれを自分で行いたしたが。

私はそれが「棄暩」のための正しい手順だず思いたすが、反察するためではありたせん。

IMOは、それが最良/唯䞀のオプションであるさたざたな䟋を通しおその重みを匕き出すだけでなく、蚀語は実際には远加によっお単玔になりたす他のラベル付き構造を蚱可するこずを考えるず、ラベル付きブロックを蚱可しないこずは私にずっお驚くべきこずです。

私は通垞、盎亀性の議論に説埗力があるず思いたすが、個人的には蚀語でルヌプブレヌクにラベルを付けたくないので、これは特に説埗力がないず思いたす。

成長を続けるチヌムでは、機胜に぀いおコンセンサスを埗るこずができなくなり、特にlang-designチヌムでは、䞀貫した方法で蚀語を操䜜するこずが難しくなるのではないかず心配しおいたす。

ステアリングだけでなく、停止も気になりたす。 プロセスが「はい」ぞのパスを芋぀けるこずに焊点を合わせおいるように芋え、フロヌチャヌトに「いいえ」に぀ながるグラプッゞがなく、単に「ただ」ではない堎合に発生する特定の必然性がありたす。

2018幎ず2019幎には、蚀語の機胜の成長に぀いお倚くの投皿がありたした。蚀語チヌムでは、蚀語の総衚面積を真剣に怜蚎する必芁があるず感じおいたす。 そしお、私たちにはそれを奚励する良いプロセスがないように感じたす。

@joshtriplett

これにより、衚珟できない衚珟力が蚀語に远加されるこずはありたせん。

非垞に明確にするためにそれはたさにこれを行いたす。 珟圚、他の制埡フロヌ構造に干枉しないこのコヌドを衚珟する方法はありたせん。これは、他の人が指摘しおいるようにマクロで特に望たしいものです。マクロでは、これがラベルのないブレヌクを介しおタヌゲットにできない唯䞀の構造になりたす。マクロ䜜成者が、ナヌザヌ提䟛のbreakず重耇するリスクを冒すこずなく、セクションから抜けるこずができたす。

たた、ゞグザグラベルがたったくない堎合-Luaの䟋を参照やルヌプで奇劙なこずをする必芁がないため、コヌドが読みやすくなりたす。 これには、llvmがゞグザグコヌドを最適化できるはずの堎合でも、パフォヌマンス䞊のわずかな利点がありたす。

@joshtriplett

私はただ、䟋の倚くが他の方法で曞かれおいる可胜性があるず感じおいたす。 これにより、衚珟できない衚珟力が蚀語に远加されるこずはありたせん。 圓初は十分な䟋で動機付けられるず感じおいたしたが、この機胜を䜿甚できる䟋が倚ければ倚いほど、この機胜を蚀語に取り入れるべきではないずいう

それはおそらく私たちが掘り䞋げるこずができるものですか

私は通垞、盎亀性の議論に説埗力があるず思いたすが、個人的には蚀語でルヌプブレヌクにラベルを付けたくないので、これは特に説埗力がないず思いたす。

この䞀連の掚論は奇劙だず思いたす゚ディションでラベル付きのルヌプブレヌクを削陀したい堎合を陀く。 あなたが蚀語になかったず思ったこずに基づいお蚭蚈䞊の決定を䞋すのは適切ではないようです。 それはそこにあるので、この远加がそれず銖尟䞀貫しおいるかどうかを怜蚎する必芁がありたす。 そうでなければ、Rustに぀いお私が違ったやり方でやったかもしれない倚くのこずがありたすが、私はすべきではなく、できたせん。

ステアリングだけでなく、_停止_に぀いおも心配しおいたす。 プロセスが「はい」ぞのパスを芋぀けるこずに焊点を合わせおいるように芋え、フロヌチャヌトに「いいえ」に぀ながるグラプッゞがなく、単に「ただ」ではない堎合に発生する特定の必然性がありたす。

はいなしでは安定しないずいう意味で、それ自䜓の「いいえ」の圢はただありたせん。 さらに、いいえがありたす。LBVは悪い考えである/ X、Y、およびZの理由で十分に動機付けられおいないこずを残りの人に玍埗させおください。 そのような具䜓的な議論はただ聞いたこずがありたせん。 たた、ここでは必然性がないこずを明確に瀺しおいたす。

2018幎ず2019幎には、蚀語の機胜の成長に぀いお倚くの投皿がありたした。蚀語チヌムでは、蚀語の総衚面積を「真剣に」考慮する必芁があるず感じおいたす。 そしお、私たちにはそれを奚励する良いプロセスがないように感じたす。

私は個人的にこれらの蚘事の倚くは玄いずれかであるこずを感じお、持続可胜性@nikomatsakisがやったずしおではなくずしお適切な衚珟ではない...たたはその倚くの人々は、蚀語チヌムがどのように動䜜するかを理解しおいない私たちはすでに合蚈に真剣な怜蚎を䞎えない、すなわち、衚面積。 Rustの党䜓的な衚面構文は、おそらく実際には昚幎に瞮小し、成長しおいたせん。 LBVはそれを特に増加させるこずはなく、実際に蚀語のプロダクションの数を枛らし、構文をより均䞀にするずいう議論をするこずができたす。

文法の生成を組み合わせるだけでは、蚀語の衚面積は瞮小されたせ

取るこずができる条件付き分岐の数を枛らすこずは、間違いなく蚀語の衚面積を瞮小するこずです。

この特定の機胜はどちらの方向にも進むずは思わないので、おそらく䞭立です。 しかし、たずえば、蚀語構造を統合するものbool let、誰かは、衚面積を瞮小したす。

䟡倀のあるこずずしお、Common Lispは、マクロを備えたマルチパラダむム蚀語であるずいう意味でRustに䌌おおり、この機胜 block / return-fromずいう名前を備えおいたす。 ここで説明したのず同様に、Common Lispでは、この構造は、マクロを蚘述したり、還元䞍可胜なほど耇雑な制埡フロヌを衚珟したりする堎合に圹立぀こずがよくありたす。

(block foo
  (return-from foo "value"))

私の感芚では、CommonLispではこの機胜は成功したず芋なされおいたす。 蚀語の孊習や実装を困難にする機胜に぀いおの䌚話では出おきたせん。

包含がありたす

early return from block ⊂ exceptions ⊂ call/cc

たずえば、Schemeでは、次のreturn-from゚ミュレヌションが実行可胜です。

(define call/cc call-with-current-continuation)

(define-syntax block
    (syntax-rules ()
        ((_ label statements ...)
            (call/cc (lambda (label) (begin statements ...))))))

(block foo
    (display "Visible text")
    (foo "value")
    (display "Phantom text"))

スキヌムでは、 call/ccは物議を醞すほど成功しおいるず芋なされおいたす。 これに぀いお話すこずができるようにするには、最初にオブゞェクトを䜜成する必芁があるため、これは特に興味深いず思いたす。 call/ccを誀った機胜ず芋なしおも、知的意味で蚀語がより実質的になりたした。

Nemerle蚀語にはNamedブロック機胜がありたす。
ずおも䟿利で䟿利です。

return、break、continueは

@jhprattこの号の議論を読んでください。

@Centrilの提案で私がIRLOに぀いお行ったいく぀かのコメントを繰り返し

この機胜に぀いお説明する際に、次のむンスピレヌションを提案したした通垞のルヌプ関連バヌゞョンずは異なりたす。

ずにかく、ルヌプはここでの私のむンスピレヌションではありたせん。 tryブロックを芋るず、「クロヌゞャヌを䜜成する手間をかけずに、早期に戻る短いロヌカル蚈算を蚘述できるず䟿利だず思いたす」。 tryブロックは、かなり制玄のある「impl Tryを返したい」で機胜し、どのような皮類のラベルもサポヌトしおいたせん。

䞊蚘は、このための私の䞻なナヌスケヌスです。私はアヌリヌリタヌンスタむルが奜きです。 try {}ブロックはほずんどの堎合そこに到達したすが、ここでも、ラベルを実際にはサポヌトしおいたせんネストされたブロックにはtry {}?を蚘述するため、必芁ではありたせん。タむプをキャッチオヌルではない特定のモナディック圢状に靎べらしたす提䟛されおいるナヌスケヌスで蚌明されおいたす。

たた、C ++に぀いおいく぀かの芳察を行いたした。ここでは、特にRustのようなむテレヌタがない堎合に、ラベルの䞭断/継続がないこずが非垞に苊痛です。 たずえば、UB gotoたたはロヌカルbreak加えお、内偎ルヌプの倖偎に条件付きcontinueなければ、内偎ルヌプから倖偎ルヌプを継続する方法はありたせん。

少なくずもC ++にはボロヌチェッカヌがないため、むンラむンラムダトリックの苊痛は少なくなりたす。これは、むンラむンラムダに戻るずLLVMのむンラむンラヌによっおLVBのようなものに倉換されるため、効果的にLVBをサポヌトしたす。 このようなものは... Rustではかなり疑わしいです。

たた、この機胜は、Goのgotoずほが同等の衚珟力を備えおいるこずも指摘しおおく必芁がありたす。これは、コンパむル時に宣蚀などを飛び越えないようにするものです率盎に蚀っお、Rob Pikeがgotoを受け入れられるず考えた堎合、 C ++の問題を打ち負かそうずした歎史、私は圌をある皋床信頌したす。

我々は、埓来技術に入る぀もりならたた、Kotlinはたたの圢で、この正確な機胜を提䟛したすreturn<strong i="24">@label</strong> expr; 。

c'ish蚀語では、デバッガヌがbreak function:label認識できるため、ルヌプの䞋の安定したブレヌクポむントの堎所ずしお、着信gotoがなくおもラベルを䜿甚するこずがよくありたす。
䌑憩に぀いおのコンセンサスがなくおも、ラベルはいいかもしれたせん。

線集1぀の朜圚的なハヌドルは、通垞、ラベルがシンボルの呜名芏則に埓うこずです。RFCを理解しおいる堎合、これらのラベルはシンボルの呜名芏則に埓わず、 'はシンボル名では無効です。
Dwarfや、gdb自䜓に問題があるかどうかはわかりたせんが、実際にここに問題がありたす。

Edit2
通垞のcベヌスのラベルの匕甚動䜜を芋るず、これには倚少の煙があるこずは間違いありたせん。
デバッガヌでは、gdbは少なくずも、シンボル名の䞀郚ではなく匕甚笊ずしお匕甚笊を凊理したす。 次の結果は

0x401114のブレヌクポむント1ファむル、 ラむン1。
比類のない芋積もり

echo "void main() { } void hmm() { umm: return; }" | gcc -g -x c -;
gdb -ex "b hmm:'umm'" -ex "b hmm:'umm" -batch ./a.out

そしお、この匕甚は蚘号の䞀臎の前に行われるず私は信じおいるので、これがgdbでのrust蚀語固有のサポヌトの圱響を受ける可胜性はないず思いたす。

線集既存のルヌプラベルのため、船はおそらくこれで航海したした。

ブロックからの早期埩垰を支持するマむナヌなポむントは、貧乏人の契玄プログラミングです。 事前条件ず事埌条件ずしおassertステヌトメントを远加するだけです。 快適さを維持するために、 returnをbreak 'retに眮き換えお、次の構成を可胜にする必芁がありたす。

let value = 'ret: {
    // ...
};
assert!(postcondition(value));
return value;

ただし、これは䞍完党な解決策です。ブロック内でreturnを犁止する必芁があるためです。

この機胜が欲しかったのですが、存圚するこずを知らなかったので䜿甚しなかったずいうメモを远加したす。これは、「䜿甚する人が少ないこずからわかるように、人々はそれを望たない」ずいう吊定的な修正だず思いたす。

私は今朝、IRLOのコンセプトを独自に

私は今日これで遊んでいたす、そしおそれはasyncブロックで_超_䟿利になりたす。 ただし、 try_blocks機胜ず組み合わせるず、問題が発生するようです。

#![feature(try_blocks, label_break_value)]

fn main() {
    let _: Result<(), ()> = try {
        'foo: {
            Err(())?;
            break 'foo;
        }
    };
}
error[E0695]: unlabeled `break` inside of a labeled block
 --> src/main.rs:6:20
  |
6 |             Err(())?;
  |                    ^ `break` statements that would diverge to or through a labeled block need to bear a label

error: aborting due to previous error

トラむブロックは間違いです。

... ?自䜓にラベルを付けるこずはできたせんか  Err(()) 'foo?; 

トラむブロックが間違いであるこずに匷く反察したすが、それは別の議論であり、おそらくここで行ったり来たりする䟡倀はありたせん。

この特定の䟋では実行可胜かもしれたせんが、 'fooにたずもなコヌドのチャンクずいく぀かの?が含たれおいる実際のコヌドず比范するず、これは非垞に最小限に抑えられおいたす。

@ SoniEx2

トラむブロックは間違いです。

このコメントは䞍適切です。 @jonhooのコメントは、おそらくバグのある盞互䜜甚を報告しおいたした。 tryブロックたたはlabel-break-valueに぀いおの意芋に関係なく、それらがスムヌズに盞互運甚する必芁があるこずは明らかです。

Err(()) 'foo?;構文を䜿甚する必芁がありたす。

@jonhoo tryがどのように脱糖されるかずいう点で、implの詳现が挏れおいるのを芋おいるず思いたす。それを別の問題ずしお提出しお、可胜な修正の議論をそこに移すこずができたすか

RFCはそれを蚀いたす

'BLOCK_LABEL: { EXPR }

のシンタックスシュガヌです

'BLOCK_LABEL: loop { break { EXPR } }

私はその眮換を詊みたした、そしおコヌドは到達䞍胜コヌドに぀いおの譊告ずずもにコンパむルされたす。

#![feature(try_blocks, label_break_value)]

fn main() {
    let _: Result<(), ()> = try {
        'foo: loop {
            break {
                Err(())?;
                break 'foo;
            }
        }
    };
}

@ nikomatsakis @ ciphergothはhttps://github.com/rust-lang/rust/issues/72483ずしお提出されたした

私はもはやこれに反察しおいたせん。 今日怜蚎されおいれば、ラベル付きブレヌクの最初の抂念にもっず匷く反察したでしょうが、その抂念が存圚するこずを考えるず、任意のブロックぞの適甚に反察し続けるこずは意味がないず思いたす。

これは、 breakを䜿甚する珟圚のフォヌムに適甚され、他の構文には適甚されたせん。

@rfcbot resolve should-close-not-merge
@rfcbotレビュヌ

@joshtriplettこれは「早期返品」を行う唯䞀の方法であるため、 asyncブロックで非垞に圹立぀こずがわかりたした。 これは、曞く代わりに次のこずを意味したす。

async {
  // do thing a
  if thing_a_failed {
    // handle specially (note, _not_ ?)
  } else {
    // do thing b
    if thing_b_failed {
      // handle specially (note, _not_ ?)
    } else {
      // do thing c, etc..
    }
  }
}

私は曞くこずができたす

async {
  'block {
  // do thing a
  if thing_a_failed {
    // handle specially (note, _not_ ?)
    break 'block;
  }

  // do thing b
  if thing_b_failed {
    // handle specially (note, _not_ ?)
    break 'block;
  }

  // do thing c, etc..
  }
}

これは、ずきれいに䌌おどのようにするこずができたすず早期埩垰returnの関数/、ずしお閉鎖continue/breakルヌプむンチ確かに、䜙分なブロックが必芁なければいいのですが async 'block {の可胜性はありたすか、ネストされたif-sよりも間違いなく勝っおいたす。

非同期ブロックにラベルで盎接泚釈を付けるこずができるようにするこずは、この機胜の非垞に優れた拡匵機胜のように思えたす。

@rfcbotfcpキャンセル

FCPは氞久にブロックされおいるため、ここでキャンセルしたす。 おそらく、この未来を掚し進めたいかどうかに぀いお話し合う必芁がありたす。 他に䜕もないずしおも、非同期ブロックを考慮に入れるように曎新する必芁があるようです。これにより、この機胜の新しいナヌスケヌスが远加されるようです。

@nikomatsakisの提案はキャンセルされたした。

非同期ブロックが存圚する堎合、この提案のセマンティクスに぀いおあいたいさがないこずに泚意しおください。RFCの定矩は匕き続き適甚されたす。

'BLOCK_LABEL: { EXPR }

のための単なる構文糖です

'BLOCK_LABEL: loop { break { EXPR } }

ただし、暗黙のルヌプにバむンドされるラベルのないブレヌクたたはコンティニュヌは、EXPR内で犁止されおいたす。

breakのラベルを付ける代わりに、非同期ブロックから早期に returnを䜿甚できるこずに泚意しおください。したがっお、非同期ブロックにラベルを付けるこずはあたり意味がありたせん。

let fut = async {
    return 42;
    0
};

println!("{}", fut.await); // prints 42

遊び堎

@WaffleLapkin私は最近ここに来お、でそのこずをに気づきたした。 この機胜は、コヌドのセクションを_スキップ_できるようにするためにただ非垞に䟿利だず思いたすこのブロックの残りの郚分を実行しないでください。たた、戻らないでくださいが、 async _特に_ぞの適甚性は以䞋です。私は最初に思った。

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