如何在DLR中实现三元运算符

时间:2012-02-14 19:08:57

标签: ternary-operator dynamic-language-runtime

我正在使用DLR在C#中实现一个语言解释器,而我在使用三元运算符时遇到了一些麻烦。此时,我已经实现了基本的函数声明/调用,如下所示:

F := (x) -> x + 1
F(1)   # returns 2

我没有遇到函数体是一系列表达式的问题 - 总是返回最后一个表达式的值,并且我确保解释器中的所有情况至少返回 < / em>作为副作用。我现在正在尝试实现三元运算符(?:)。我正在渲染的表达式树看起来像这样:

work = Expression.IfThenElse(                                   
    Expression.IsTrue(Expression.Convert(work, typeof(Boolean))), 
    trueExp, 
    falseExp);

其中trueExp和falseExp都是有效的表达式。

问题似乎是IfThenElse表达式没有返回值,所以基本上即使trueExp和falseExp构建表达式树,IfThenElse表达式的最终结果也始终为null。如果没有制作运行时功能并明确调用它,有没有办法使用DLR实现三元运算符? (即:表达式。执行IfThenElse并返回true和false子句中的实际值?)

我希望解析的内容如下:

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

但是现在由于上面列出的问题,这在编译成程序时总是返回null。

我很感激任何帮助,这非常令人烦恼!

1 个答案:

答案 0 :(得分:17)

Expression.IfThenElseif (...) ... else ...;构造,而不是三元运算符。

三元运算符为Expression.Condition