RFC: 1558-closure-to-fn-coercion.md
Rustには1.19.0で導入
moveやborrow、またはローカル変数にその他のアクセス(キャプチャ)をしないクロージャは、関数ポインタ(fn)に暗黙変換可能であるべき。
| package main | |
| import ( | |
| "os" | |
| "io" | |
| ) | |
| func main() { | |
| io.Copy(os.Stdout, os.Stdin) | |
| } |
RFC: 1558-closure-to-fn-coercion.md
Rustには1.19.0で導入
moveやborrow、またはローカル変数にその他のアクセス(キャプチャ)をしないクロージャは、関数ポインタ(fn)に暗黙変換可能であるべき。
ざっと調べた。言語を実装する時に疑問に思う細かい部分はまだ拾いきれていない(探せばありそう)。
コルーチン内で別の関数を呼び出す場合、その関数の呼び出し中に現在のコルーチンをsuspend不可とする制限をもたせる(call stackが深い部分でsuspendを許可しない)。 その制限によって、コルーチンのsuspend時に関数のcall stackを全て保存する必要がなくなる。
| def main() { | |
| ref a = fib(10); | |
| a.print(); | |
| } | |
| import std.stdio; | |
| def fib(v: int32): int32 { | |
| return if ( v == 0 ) 0 | |
| else if ( v == 1 ) 1 |
| import std.stdio; | |
| import std.assert; | |
| def main() { | |
| val a = fib!(40)(); | |
| assert( a == 102334155 ); | |
| a.print(); | |
| } | |
| def fib!(v: int32)(): int32 when v == 0 { |
| MENHIR_FLAGS_BASE = --infer -v | |
| MENHIR_FLAGS = $(MENHIR_FLAGS_BASE) --only-tokens | |
| MenhirMulti(tokens, tokens) | |
| OCamlGeneratedFiles(tokens.ml) | |
| MENHIR_FLAGS = $(MENHIR_FLAGS_BASE) --external-tokens Tokens | |
| MenhirMulti(parser, tokens parser) | |
| OCamlGeneratedFiles(parser.ml lexer.ml) |
| .HeartAnimationContainer { | |
| width: 28px; | |
| height: 24px; | |
| margin-bottom: -3px; | |
| } | |
| .HeartAnimation { | |
| margin-top: 6px; | |
| margin-left: 11px; | |
| padding-top: 11px; |
| x := 2 + 10; | |
| x := 5; | |
| skip; | |
| x := 10; | |
| y := x + 10; | |
| x := x - 1; | |
| skip |
| #!/bin/bash | |
| # ref. https://www.parse.com/downloads/cloud_code/installer.sh | |
| TMP_FILE=/tmp/parse.tmp | |
| if [ -e ${TMP_FILE} ]; then | |
| echo "Cleaning up from previous install failure" | |
| rm -rf ${TMP_FILE} | |
| fi | |
| echo "Fetching latest version ..." |