Большинство языков программирования (как динамически, так и статически типизированных) имеют специальные ключевые слова и / или синтаксис, которые выглядят значительно иначе, чем объявления переменных для объявления функций. Я вижу функции как объявление другой именованной сущности:
Например в Python:
x = 2
y = addOne(x)
def addOne(number):
return number + 1
Почему бы нет:
x = 2
y = addOne(x)
addOne = (number) =>
return number + 1
Точно так же на языке как Java:
int x = 2;
int y = addOne(x);
int addOne(int x) {
return x + 1;
}
Почему бы нет:
int x = 2;
int y = addOne(x);
(int => int) addOne = (x) => {
return x + 1;
}
Этот синтаксис кажется более естественным способом объявления чего-либо (будь то функция или переменная) и одного ключевого слова меньше, как def
или function
в некоторых языках. И, IMO, он более последовательный (я смотрю там же, чтобы понять тип переменной или функции) и, вероятно, делает синтаксический анализатор / грамматику немного проще для написания.
Я знаю, что очень немногие языки используют эту идею (CoffeeScript, Haskell), но большинство распространенных языков имеют специальный синтаксис для функций (Java, C ++, Python, JavaScript, C #, PHP, Ruby).
Даже в Scala, которая поддерживает оба способа (и имеет вывод типов), чаще пишут:
def addOne(x: Int) = x + 1
Скорее, чем:
val addOne = (x: Int) => x + 1
IMO, по крайней мере в Scala, это, пожалуй, самая легко понятная версия, но за этой идиомой редко следуют:
val x: Int = 1
val y: Int = addOne(x)
val addOne: (Int => Int) = x => x + 1
Я работаю над своим собственным игрушечным языком, и мне интересно, есть ли какие-нибудь подводные камни, если я создаю свой язык таким образом, и есть ли какие-либо исторические или технические причины, по которым этот шаблон широко не используется?
(int => int) addOne = (x) => {
это гораздо более "особенный" и "сложный", чем int addOne(int) {
...