Ich modelliere eine Programmiersprache zum Spaß und die Syntax wird stark von Scala-spezifischen Funktionsdefinitionen beeinflusst.
Ich bin auf ein Entwurfsproblem gestoßen, weil meine Sprache nicht zwischen Funktionen unterscheidet, die über die def
Syntax (Klassenmethoden) definiert wurden, und anonymen Funktionen, die Werten zugewiesen wurden (erstellt mit =>
) - sie beseitigt die Unterschiede sowohl in der Implementierung als auch im Verhalten .
Das Ergebnis ist, dass die folgenden zwei Definitionen dasselbe bedeuten:
def square(x: Int) = x*x
val square = (x: Int) => x*x
Es gibt keinen Grund, das letztere Formular (sofortige anonyme Funktionszuweisung) in einer normalen Situation zu verwenden - es ist einfach möglich , es anstelle des def
Formulars zu verwenden.
Würde eine solche doppelte Syntax zum Definieren benannter Funktionen die Orthogonalität der Sprache oder einen anderen Designaspekt beeinträchtigen?
Ich bevorzuge diese Lösung, weil sie kurze und intuitive Definitionen von Methoden und benannten Funktionen (via def
) sowie kurze Definitionen anonymer Funktionen (using =>
) ermöglicht.
Edit: Scala tut Unterscheidung der beiden - anonyme Funktionen sind nicht das gleiche wie Methoden definiert mit def
in Scala. Die Unterschiede sind jedoch relativ subtil - siehe die Beiträge, die ich zuvor verlinkt habe.
val
Notation definieren?
fun
eine rekursive Funktion definieren.
def
. Es ist nur ein Nebeneffekt der Tatsache, dass eine anonyme Funktion, (x : Int) => x + 1
beispielsweise ein Objekt, ist und Objekte Werten mit zugewiesen werden können val f = ...
. Die Sprachdesigner hätten auf den Weg zu gehen , um die Syntax zu verbieten. Es ist nicht ganz dasselbe, als sich explizit darum zu bemühen, zwei verschiedene Syntaxen zu unterstützen, die (ungefähr) dasselbe tun.
However, assigning existing functions
scheint das Ende des Satzes zu fehlen