暗黙の引数がなぜか動作
ラムダ式の引数をいちいち書くのがじゃんくさいから$1とかで引数にアクセスできるようにしてみた
ひさびさにレキサをちょっと変更して名前解決の時に$1をArgumentsにぶちこむようなコードだけ書いたところ・・・なぜか完成した
なんでや、ILでは引数1個の関数をなんで呼び出し側が引数3個でうまく動くねん!
この時ILはこうなっていた
なるほど引数が違う関数ポインタをInvokeしてもおちないんだ・・・ええんか、これ?
.NETの呼び出し規約は呼び出し側が引数をpopするのか?よく分かんないや
f(=> print($1)) ↓ newobj instance void 'Bind_#5,0'::.ctor() stloc.0 ldloc.0 ldftn void 'implicit_param2.#5,0'(int32) stfld native int 'Bind_#5,0'::f ldloc.0 ldftn instance void 'Bind_#5,0'::Invoke(int32) newobj instance void class [mscorlib]System.Action`1<int32>::.ctor(object, native int) call void implicit_param2.f(class [mscorlib]System.Action`3<int32,string,int32>)
ローカルスコープに対応
ローカルスコープが扱えるようになりifの中で変数が定義できるようになった
スコープ内で外側の変数と同名の変数を定義した場合、別の変数として扱うことにした
オーソドックスなCと同じ仕様にした
なんかjavascriptあたりがきしょい動きをしていたような気がする
クロージャ変数の取り扱いがちょっと変わった
今までは関数スコープにクロージャ変数とマークされた変数があればframeを作りつつぶちこんでいた
今度からはローカルにクロージャ変数があるやもしれへん
クロージャ変数が見つかったタイミングで関数へframeを作るようにし、ローカルスコープ側から関数のframeを作るようにした
nullに対応
nullに対応した
え、いまさら?
はい
nullはNull型のインスタンスとした
せやから[Foo | Bar]?
は[Foo | Bar | Null]
のシンタックスシュガーになる
CILでは値型にnull入れれへんから、Object型にしてBox/UnBoxする事にした
.NET Frameworkの参照型はnullが無制限で入るから、全部Foo?
にするんかい、って所は面倒なのであまりやりたくない
ただ、本当にnullを入れたい時に型が合わんくて代入できなくなるから・・・そのうちやらんといかん