Closed8

関数を返す関数を返す

kumavalekumavale

「(関数を返す関数)を返す」(関数という一括りにしてしまって良いかは分からない)
先ずはこうすれば、inner functionを返せる。

fn main() {
    foo()();
}

fn foo() -> impl Fn() {
    fn bar() {}
    bar
}
kumavalekumavale

クロージャでも良い(普通はこっち)

fn main() {
    foo()();
}

fn foo() -> impl Fn() {
    ||{}
}
kumavalekumavale

さて、戻り値に関数のシグネチャを書きたい。

fn main() {
    foo()();
}

fn foo() -> impl Fn() -> impl Fn() {
    ||{ ||{} }
}

でもこれはコンパイルエラーになる。

error[E0562]: `impl Trait` only allowed in function and inherent method return types, not in `Fn` trait return
 --> src/main.rs:5:26
  |
5 | fn foo() -> impl Fn() -> impl Fn() {
  |                          ^^^^^^^^^

For more information about this error, try `rustc --explain E0562`.
error: could not compile `sandbox` due to previous error

RFC 1522に詳しい説明がある。(TODO: 後で読む)

kumavalekumavale

戻り値の型を書けないのであれば、推論してもらえばいい!

fn main() {
    let foo = ||{
        ||{
            ||{}
        }
    };
    foo()()();
}

これで関数を返す関数を返す関数を書けた。

kumavalekumavale

やりすぎ注意

fn main() {
    ||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}};
}
error: could not compile `sandbox`

Caused by:
  process didn't exit successfully: `rustc --crate-name sandbox --edition=2021 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=6cc2c8934a3eaa5b -C extra-filename=-6cc2c8934a3eaa5b --out-dir /mnt/c/home/tmp/sandbox/target/debug/deps -C incremental=/mnt/c/home/tmp/sandbox/target/debug/incremental -L dependency=/mnt/c/home/tmp/sandbox/target/debug/deps` (signal: 11, SIGSEGV: invalid memory reference)
kumavalekumavale

543ネストまではいけた。
544ネストでアウト。

OKなコード
fn main() {
    ||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}; // 543
}
NGなコード
fn main() {
    ||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}; // 544
}

環境によって違うかも。
因みにRust1.66.0 on WSL2

$ rustc -V
rustc 1.66.0 (69f9c33d7 2022-12-12)
kumavalekumavale

ギリOKなコードを実行してみようとしたらコンパイルエラーになった。
(,),(,)を追加したらダメだったので、|,|,{,}を削除して542ネストでやってみたら実行できた。
空白は関係ないっぽいので、1行で解釈できるトークンの数に制限があるっぽい?
いや、そうじゃないっぽい

kumavalekumavale

実行するなら542ネストが限界かな。

fn main() {
    (||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}})()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()(); // 542
}
このスクラップは2023/03/15にクローズされました