Estoy modelando un lenguaje de programación por diversión, y la sintaxis está fuertemente influenciada por Scala, específicamente las definiciones de funciones.
Me he encontrado con un problema de diseño porque mi lenguaje no diferencia entre las funciones definidas a través de la defsintaxis (métodos de clase) y las funciones anónimas asignadas a los valores (creados usando =>): elimina las diferencias tanto en la implementación como en el comportamiento .
El resultado es que las siguientes dos definiciones significan lo mismo:
def square(x: Int) = x*x
val square = (x: Int) => x*x
No hay ninguna razón para usar esta última forma (asignación de función anónima inmediata) en cualquier situación normal; simplemente es posible usarla en lugar de la defforma.
¿Tener una sintaxis duplicada para definir funciones con nombre dañaría la ortogonalidad del lenguaje o algún otro aspecto del diseño?
Prefiero esta solución porque permite definiciones cortas e intuitivas de métodos y funciones con nombre (vía def), y definiciones cortas de funciones anónimas (usando =>).
Editar: Scala hace diferenciar entre los dos - anónimo funciones no son las mismas que con los métodos definidos defen Scala. Sin embargo, las diferencias son relativamente sutiles: vea las publicaciones que he vinculado antes.
valnotación?
funpara definir una función recursiva.
defes. Es solo un efecto secundario del hecho de que una función anónima, digamos, (x : Int) => x + 1es un objeto, y los objetos pueden asignarse a valores con val f = .... Los diseñadores del lenguaje habrían tenido que salir de su camino para no permitir la sintaxis. No es lo mismo que hacer un esfuerzo explícito para admitir dos sintaxis diferentes que hacen (aproximadamente) lo mismo.
However, assigning existing functionsparece faltar el final de la oración