Gauche > Archives > 2014/10/05

2014/10/05 05:51:40 UTCとおる。
#
Scheme の継続の呼び出しや Lua の coroutine.yield() は関数呼び出し(特別な構文ではない)なのに対し、Python や ES6 や C# の yield は構文なのはどうしてでしょうかね? 特別な構文にしたらそれだけ柔軟性が下がると思うんですが、何かメリットがあるのかな?
#
まあ Lua の coroutine.yield は「現在の」コルーチンに対して作用する物なので、Scheme の継続ほどどこにでももっていける訳じゃないですけど。
2014/10/05 05:59:45 UTCshiro
#
yieldを呼ぶ場所に制限がない(特定のイテレータの中だけ、ではなく、そこから呼び出される任意の関数の中にも書ける)場合は、単にスタイルの問題だと思います。機能的にはyieldを包む関数を書いてやれば同じことになるので。その場合、わざわざ構文にするのは「なるべく制御が他に移る箇所を明示したい」みたいな言語設計者の思想になるでしょう。
#
そうではなくyieldを特定のコンテキストにしか置けない場合は、コンパイラの都合による制限の可能性があります。例えばイテレータ関数の中に直接yieldが書いてあると、コンパイル時にそこで関数を分割してCPSで呼び出すように変換できるので。
2014/10/05 07:05:58 UTCとおる。
#
ES6(Node.js 0.11 を --harmony 付きで実行)の場合は、yield を普通の関数で包むのはダメみたいでした。構文エラー。ES6 の場合は yield は function ではなく function* の中にしか書けないっぽい。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
#
ただたしかにアプリケーションのコードとしては、関数を読んだ先で yield されてていつまでたっても返ってこない、みたいなのは混乱の元なので、わざと強い制限をかけてるのかも。
2014/10/05 21:57:57 UTCshiro
#
初見で使う人にどうやって機能を見つけてもらうかってのはむづかしい問題だな