Modeluję język programowania dla zabawy, a na składnię ma duży wpływ Scala - w szczególności definicje funkcji.
Wystąpił problem projektowy, ponieważ mój język nie rozróżnia funkcji zdefiniowanych za pomocą def
składni (metody klasowe) i funkcji anonimowych przypisanych do wartości (utworzonych przy użyciu =>
) - usuwa różnice zarówno w implementacji, jak i zachowaniu .
W rezultacie następujące dwie definicje oznaczają to samo:
def square(x: Int) = x*x
val square = (x: Int) => x*x
Nie ma powodu, aby ten drugi formularz (natychmiastowe przypisanie funkcji anonimowej) był używany w normalnej sytuacji - po prostu można go użyć zamiast def
formularza.
Czy posiadanie takiej zduplikowanej składni do definiowania nazwanych funkcji zaszkodziłoby ortogonalności języka lub innemu aspektowi projektowania?
Wolę to rozwiązanie, ponieważ pozwala ono na krótkie i intuicyjne definicje metod i nazwanych funkcji (via def
) oraz krótkie definicje funkcji anonimowych (using =>
).
Edit: Scala czyni rozróżnienia między tymi dwoma - funkcje anonimowe nie są takie same jak z metod określonych def
w Scala. Różnice są jednak stosunkowo subtelne - zobacz posty, które wcześniej podlinkowałem.
val
notacji?
fun
aby zdefiniować funkcję rekurencyjną.
def
. Jest to tylko efekt uboczny tego, że anonimowa funkcja, powiedzmy, (x : Int) => x + 1
jest obiektem, a obiekty można przypisywać do wartości za pomocą val f = ...
. Projektanci języka musieliby zrobić wszystko, aby nie dopuścić do składni. Nie jest to dokładnie to samo, co jednoznaczne włożenie wysiłku w celu obsługi dwóch różnych składni, które wykonują (w przybliżeniu) to samo.
However, assigning existing functions
wydaje się, że brakuje końca zdania