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!
Perfecto! Gracias – Gakidou
¿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;'? –
@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. –