A maioria das linguagens de programação (linguagens de tipo dinâmico e estaticamente) possui palavras-chave e / ou sintaxe especiais que parecem muito diferentes do que declarar variáveis para declarar funções. Vejo funções como apenas declarar outra entidade nomeada:
Por exemplo, em Python:
x = 2
y = addOne(x)
def addOne(number):
return number + 1
Por que não:
x = 2
y = addOne(x)
addOne = (number) =>
return number + 1
Da mesma forma, em uma linguagem como Java:
int x = 2;
int y = addOne(x);
int addOne(int x) {
return x + 1;
}
Por que não:
int x = 2;
int y = addOne(x);
(int => int) addOne = (x) => {
return x + 1;
}
Essa sintaxe parece uma maneira mais natural de declarar algo (seja uma função ou uma variável) e uma palavra-chave a menos como def
ou function
em alguns idiomas. E, na IMO, é mais consistente (eu procuro o mesmo local para entender o tipo de uma variável ou função) e provavelmente torna o analisador / gramática um pouco mais simples de escrever.
Eu sei que muito poucas linguagens usam essa ideia (CoffeeScript, Haskell), mas as linguagens mais comuns têm sintaxe especial para funções (Java, C ++, Python, JavaScript, C #, PHP, Ruby).
Mesmo em Scala, que suporta os dois lados (e tem inferência de tipo), é mais comum escrever:
def addOne(x: Int) = x + 1
Ao invés de:
val addOne = (x: Int) => x + 1
Na IMO, pelo menos em Scala, essa é provavelmente a versão mais facilmente compreensível, mas esse idioma raramente é seguido:
val x: Int = 1
val y: Int = addOne(x)
val addOne: (Int => Int) = x => x + 1
Estou trabalhando na minha própria linguagem de brinquedos e estou me perguntando se há alguma armadilha se eu projetar minha linguagem dessa maneira e se há alguma razão histórica ou técnica, esse padrão não é amplamente seguido.
(int => int) addOne = (x) => {
é muito mais "especial" e "complexo" do que int addOne(int) {
...