Я использую интерпретатор языка в 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
Но сейчас это всегда возвращает нуль когда он скомпилирован в программу, из-за проблемы, описанной выше.
Буду признателен за любую помощь, это очень досадно!
Отлично! Спасибо – Gakidou
Можно ли эмулировать Expression.Condition с Expression.IfThenElse? вместо «вернуть a? b: c' do 'if (as) return b else return c;'? –
@zespri: Если все, что вы хотите сделать, это вернуть значение, конечно. В этом случае они одинаковы. Очевидно, вы не можете использовать IfThenElse * внутри * другое выражение, хотя это утверждение. Лично я нахожу 'return a? b: c; более легко понять. –