Я использую интерпретатор языка в 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? (то есть: выражение. которое делает IfThenElse и возвращает фактические значения в предложениях true и false?)
То, что я надеюсь разобрать, выглядит примерно так:
F := (x) -> (x = 1) ? 4 : 5
F(1) #4
F(2) #5
Но сейчас это всегда возвращает ноль при компиляции в программу из-за проблемы, описанной выше.
Буду признателен за любую помощь, это довольно неприятно!