2012-02-14 3 views
5

Я использую интерпретатор языка в C#, используя DLR, и у меня возникают проблемы с тернарным оператором. На данный момент, у меня есть реализованы основные функции декларация/вызовы, например, так:Как реализовать тернарный оператор в 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 всегда равен нулю. Если вы не выполняете функцию Runtime и явно вызываете ее, существует ли способ реализовать тернарный оператор, используя DLR? (То есть:.? Это выражение, которое делает IfThenElse и возвращает фактические значения в истинных и ложных положений)

То, что я надеюсь, что разобрать что-то вроде:

F := (x) -> (x = 1) ? 4 : 5 
F(1) #4 
F(2) #5 

Но сейчас это всегда возвращает нуль когда он скомпилирован в программу, из-за проблемы, описанной выше.

Буду признателен за любую помощь, это очень досадно!

ответ

14

Expression.IfThenElse является конструкцией if (...) ... else ...;, а не тернарным оператором.

Терминальный оператор: Expression.Condition

+0

Отлично! Спасибо – Gakidou

+0

Можно ли эмулировать Expression.Condition с Expression.IfThenElse? вместо «вернуть a? b: c' do 'if (as) return b else return c;'? –

+0

@zespri: Если все, что вы хотите сделать, это вернуть значение, конечно. В этом случае они одинаковы. Очевидно, вы не можете использовать IfThenElse * внутри * другое выражение, хотя это утверждение. Лично я нахожу 'return a? b: c; более легко понять. –