Я реализую языковой интерпретатор на 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 при компиляции в программу , из-за проблемы, описанной выше.
Буду признателен за любую помощь, это очень досадно!