私はDLRを使用してC#で言語インタープリタを実装していますが、三項演算子にいくつか問題があります。この時点で、私は実装され、基本的な関数宣言/呼び出しは、そのようにしている:DLRで三項演算子を実装する方法
F := (x) -> x + 1
F(1) # returns 2
私は、関数本体が式の列であることに問題があっていませんでした - 最後の式の値が常に返されます私は、通訳者のすべてのケースが少なくとも何かを返すようにしました。副作用としてがありました。私は今、三項演算子(?:)を実装しようとしています。
work = Expression.IfThenElse(
Expression.IsTrue(Expression.Convert(work, typeof(Boolean))),
trueExp,
falseExp);
ここで、trueExpとfalseExpは両方とも有効な式です。
問題は、IfThenElse式が値を返さないため、基本的にtrueExpおよびfalseExpが式ツリーを構築していても、IfThenElse式の最終結果は常にnullです。ランタイム関数を作成して明示的に呼び出すのではなく、DLRを使用して三項演算子を実装する方法はありますか? (すなわち:。?式IfThenElseを行い、真と偽の句で実際の値を返す)
私が解析したいと考えてすることのようなものです:
F := (x) -> (x = 1) ? 4 : 5
F(1) #4
F(2) #5
しかし、今、これは常にnullを返します上に概説した問題のために、プログラムにコンパイルされたとき。
私は何か助けていただきありがとうございます、これは非常に厄介です!
パーフェクト! – Gakidou
Expression.IfThenElseでExpression.Conditionをエミュレートすることは可能ですか?すなわち「返品する」の代わりに? b:c' do(as)return b else else c; '? –
@ zespri:あなたがしたいのは、値を返すことだけです。その場合、彼らは同じです。明らかにIfThenElse *を別の式の中に使用することはできません。個人的に私は 'return a? b:c; 'もっと簡単に理解する。 –