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 defsintaxe (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 defformulá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 defem Scala. As diferenças são relativamente sutis - veja as postagens que eu vinculei antes.
valnotação?
funpara 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 functionsparece estar faltando o final da frase