2012-02-14 5 views
5

私は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を返します上に概説した問題のために、プログラムにコンパイルされたとき。

私は何か助けていただきありがとうございます、これは非常に厄介です!

答えて

14

Expression.IfThenElseは、3進演算子ではなくif (...) ... else ...;です。

3進演算子はExpression.Condition

+0

パーフェクト! – Gakidou

+0

Expression.IfThenElseでExpression.Conditionをエミュレートすることは可能ですか?すなわち「返品する」の代わりに? b:c' do(as)return b else else c; '? –

+0

@ zespri:あなたがしたいのは、値を返すことだけです。その場合、彼らは同じです。明らかにIfThenElse *を別の式の中に使用することはできません。個人的に私は 'return a? b:c; 'もっと簡単に理解する。 –