reflection - tesis - Scala equivalente a la API de expresión de C#
tesis sobre youtube pdf (4)
Esto no es compatible con Scala. ScalaQL: Language-Integrated Database Queries para Scala describe una funcionalidad tipo LINQ en Scala:
Si bien es posible que Microsoft simplemente amplíe su lenguaje con esta característica particular, los desarrolladores de aplicaciones humildes no son tan afortunados. Por ejemplo, no hay forma de que nadie (fuera de Sun Microsystems) implemente ningún tipo de LINQ dentro de Java debido a las modificaciones de lenguaje que se requerirían. Nos enfrentamos a un problema similar al intentar implementar LINQ en Scala.
Afortunadamente, Scala es en realidad lo suficientemente potente como para implementar una forma de LINQ incluso sin agregar soporte para árboles de expresiones. Mediante una combinación de sobrecarga del operador, conversiones implícitas y semántica de llamada por nombre controlada, hemos podido lograr el mismo efecto sin realizar ningún cambio en el lenguaje en sí.
¿Es su equivalente a la API de expresión de C # en scala?
Por ejemplo, me gustaría tener un lambda como este:
(Foo) => Foo.bar
y poder acceder a "barra" en la función a la que se le pasa.
Hay un scala.reflect.Code.lift
experimental que podría ser de interés, pero la respuesta corta es no, Scala no tiene acceso al AST en ninguna forma (los árboles de expresión son un subconjunto de AST de C #).
No es muy claro para mí lo que quieres. Si desea una función que devuelva un getter para un campo, puede hacerlo con bastante facilidad:
class Holder(var s: String) { }
class StringSaver(f: Holder => (() => String), h: Holder) {
val getter = f(h)
def lookAtString = getter()
}
val held = new Holder("Hello")
val ss = new StringSaver((h: Holder) => (h.s _) , held)
println(ss.lookAtString)
held.s = "Bye now"
println(ss.lookAtString)
La clave es convertir el getter hs en una función vía (hs _).
No, a lo mejor de mi conocimiento.