次のような式を持つパーサジェネレータを作成しました。
a = f:"foo" "bar" { /* your code here */ }
これは、流行の後、次のようなコードを生成します。
r0 = this.ReturnHelper<string>(cursor, cursor, () => /* your code here */);
f
ユーザーは値を返すなどの式を指定したり、中括弧のセットを追加してメソッドを記述したりできるため、これは完璧です。ここまでは順調ですね。
今、私はこのようなアサーションも許可します:
a = w:word !{ w == "disallowed" }
これは、現在、次のようなものにコンパイルされます。
var w = this.ParseWord(...).Value;
...
if (!( w == "disallowed" ))
{
r2 = new ParseResult<string>(cursor, cursor, string.Empty);
}
ReturnHelperが提供するのと同じmethod-bodyオプションをアサーションでサポートするようにしたいのですbool AssertionHelper(Func<bool> assertion)
が、述語を呼び出すだけのメソッドを使用するのは非効率的です。
それnew Func<bool>(() => /* your code here */)()
がうまくいくと思っていましたが、それが最も効率的かどうかはわかりません。
何か案は?
編集
どう いいえ、上記のバージョンと同じILを生成します。((Func<bool>)(() => /* code */))()
ですか?それは割り当てを回避しますか?