2012-02-14 41 views
5

Estoy implementando un intérprete de lenguaje en C# utilizando el DLR, y estoy teniendo algunos problemas con el operador ternario. En este punto, tengo declaraciones de funciones básicas/llamadas implementadas, así:Cómo implementar el operador ternario en el DLR

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

No he tenido un problema con un cuerpo de la función de ser una secuencia de expresiones - el valor de la última expresión siempre se devuelve , y me he asegurado de que todos los casos en el intérprete devuelvan al menos algo como efecto secundario. Ahora estoy tratando de implementar el operador ternario (? :). El árbol de expresiones que estoy representando se ve así:

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

donde trueExp y falseExp son expresiones válidas.

El problema parece ser que la expresión IfThenElse no devuelve un valor, por lo que, básicamente, aunque trueExp y falseExp están construyendo árboles de expresión, el resultado final de la expresión IfThenElse es siempre nulo. Aparte de hacer una función Runtime y llamarla explícitamente, ¿hay alguna manera de implementar el operador ternario utilizando el DLR? (Es decir:.? Una expresión que hace el IfThenElse y devuelve los valores reales en las cláusulas de verdaderos y falsos)

Lo que espero que analizar es algo así como:

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

Pero ahora esto siempre devuelve null cuando se compila en un programa, debido al problema descrito anteriormente.

Agradecería cualquier ayuda, ¡esto es bastante fastidioso!

Respuesta

14

Expression.IfThenElse es una construcción if (...) ... else ...;, no el operador ternario.

El operador ternario es Expression.Condition

+0

Perfecto! Gracias – Gakidou

+0

¿Es posible emular Expression.Condition con Expression.IfThenElse? es decir, en lugar de 'devolver a? b: c' do 'if (as) return b else return c;'? –

+0

@zespri: Si todo lo que quiere hacer es devolver un valor, seguro. En ese caso, son lo mismo. Obviamente, no puedes usar IfThenElse * dentro de otra expresión, ya que es una afirmación. Personalmente encuentro 'return a? b: c; 'más fácil de comprender sin embargo. –

Cuestiones relacionadas