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ą defskł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 defformularza.
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 defw Scala. Różnice są jednak stosunkowo subtelne - zobacz posty, które wcześniej podlinkowałem.
valnotacji?
funaby zdefiniować funkcję rekurencyjną.
def. Jest to tylko efekt uboczny tego, że anonimowa funkcja, powiedzmy, (x : Int) => x + 1jest 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 functionswydaje się, że brakuje końca zdania