Как реализовать троичный оператор в DLR - PullRequest
5 голосов
/ 14 февраля 2012

Я использую интерпретатор языка в 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

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

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

1 Ответ

17 голосов
/ 14 февраля 2012

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

Тернарным оператором является Expression.Condition

...