.NETのYieldが何をしているか
.NETのYieldがどんなふうにILを出力してるんか調べてみた
VBだけ調べたけどC#も多分一緒だろう
割とcall/ccするのめんどいな
1. Yieldの付いた関数毎にIEnumeratorなクラスを作る、とりあえずStateMachineと呼ぶ
2. Yieldの付いた関数の引数、ローカル変数を全部メンバ変数に持つ
3. 戻り値と状態もメンバ変数に持つ
4. Yieldの出現箇所にユニークな連番を振る
5. Yieldしている個所の前で次のことをする
・Yieldの値を戻り値のメンバ変数に入れる
・4.で付けたユニークな番号を状態のメンバ変数に入れる
・Return Trueしとく
・Returnの後にユニークな番号に対応したラベルを張る
6. 関数を抜けるときに次のことをする
・最終行でっせというラベルを張る
・状態のメンバ変数に最終行でっせという値を入れる
・Return Falseする
' 呼び出し側 For Each x In Cdr(xs) ' なんか処理 Next Public Shared Iterator Function Cdr(xs As List(Of Integer)) For i = 1 To xs.Count - 1 Yield xs(i) Next End Function ↓ ' 呼び出し側 For Each x In New StateMachine With {._xs = xs} ' なんか処理 Next ' Yieldの関数展開結果 Class StateMachine Implements IEnumerator Private _i As Integer Private _xs As List(Of Integer) Private _value As Integer Private _state_machine As Integer = 0 Public ReadOnly Property Current() As Boolean Get Return _value End Get End Property Public Function MoveNext() As Boolean If _state_machine = 1 Then Goto __STATE1 If _state_machine = 2 Then Goto __STATE2 _i = 1 Do While _i <= _xs.Count - 1 _value = _xs(_i) _state_machine = 1 Return True __STATE1: _i += 1 Loop __STATE2: _state_machine = 2 Return False End Function End Class
簡単にcdrするILの関数書きたいだけなんだけど難しいなー・・・