最近Haxeやってる。 モダンな機能はだいたいサポートしていて、結構気持ち良くコード書ける。 ただちょっと触っていて、リスト操作周りが若干直感に反する感じがあったりしてもにょった。
例えばLambdaがIteratorをサポートしていないとか。 なので
(0...10).iter(function(i) {trace(i);});
とか出来ない。
調べてみると、mixinという形でC#でいう拡張メソッドが使えるらしい。
なので
class Enumerator { public static function as_enumerable<T>(iter : Iterator<T>) : Iterable<T> { return {iterator : function(){return iter;}} } }
こんなものを定義してやれば
using Enumerator; (0...10) .as_enumerable() .iter(function(i) {trace(i);});
みたいに書けるようだ。
わざわざ型を書かなくても、関数の型定義から返り値の匿名構造体をIterable
ちなみに、これについてはGithubにissueが上がっていたりして (https://github.com/HaxeFoundation/haxe/issues/1914) みたいなことが書かれていたのだけれど、わざわざ抽象型を定義するのは抵抗感あるし、この解決法のが僕の好みかな。
Milestone: 3.2 って書かれているし、そのうちサポートされるんだろうけど。