Estou modelando uma linguagem de programação por diversão, e a sintaxe é fortemente influenciada pelas definições de função do Scala - especificamente.
Eu encontrei um problema de design porque minha linguagem não diferencia entre funções definidas por meio da def
sintaxe (métodos de classe) e funções anônimas atribuídas a valores (criados usando =>
) - remove as diferenças de implementação e comportamento .
O resultado é que as duas definições a seguir significam a mesma coisa:
def square(x: Int) = x*x
val square = (x: Int) => x*x
Não há motivo para o último formulário (atribuição imediata de função anônima) ser usado em qualquer situação normal - é simplesmente possível usá-lo em vez do def
formulário.
Ter essa sintaxe duplicada para definir funções nomeadas prejudicaria a ortogonalidade da linguagem ou algum outro aspecto do design?
Prefiro esta solução porque permite definições curtas e intuitivas de métodos e funções nomeadas (via def
) e definições breves de funções anônimas (usando =>
).
Editar: Scala faz diferenciar entre os dois - anónimo funções não são os mesmos como definidos com métodos def
em Scala. As diferenças são relativamente sutis - veja as postagens que eu vinculei antes.
val
notação?
fun
para definir uma função recursiva.
def
é. É apenas um efeito colateral do fato de que uma função anônima, digamos, (x : Int) => x + 1
é um objeto, e os objetos podem ser atribuídos a valores com val f = ...
. Os projetistas da linguagem teria que sair de seu caminho para não permitir a sintaxe. Não é exatamente o mesmo que se esforçar explicitamente para oferecer suporte a duas sintaxes diferentes que fazem (aproximadamente) a mesma coisa.
However, assigning existing functions
parece estar faltando o final da frase