Більшість мов програмування (як динамічно, так і статично набрані мови) мають спеціальне ключове слово та / або синтаксис, який виглядає набагато інакше, ніж декларування змінних для декларування функцій. Я бачу функції так само, як декларування іншого названого об'єкта:
Наприклад в 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) {
...