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

Я надеюсь проанализировать что-то вроде:

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

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

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

5
задан Gakidou 14 February 2012 в 19:08
поделиться