Das Argument, das immer zugunsten von Clojure vorgebracht wird, ist das folgende.
Die Syntax ist einfacher und es gibt nur eine Möglichkeit, Code ohne komplizierte Regeln auszudrücken.
Scala hat jedoch im Vergleich zu Clojure viele verschiedene Arten von Syntax und Konstrukten.
Aber seit ich letzte Woche versucht habe, Clojure zu lernen, habe ich festgestellt, dass die Liste der eingebauten Makros endlos ist. Obwohl wir sie mit derselben Klammernsyntax schreiben, müssen wir lernen, wie jedes funktioniert.
Inwiefern ist die Syntax von Clojure einfacher? Für LISPer mag es sein, aber für Menschen mit einem anderen Hintergrund scheint es einfacher zu sein, verschiedene Konstrukte in Scala zu lernen.
Welche Syntax ist aus neutraler Sicht einfacher und lesbarer?
Antworten:
Das sind zwei sehr unterschiedliche Fragen.
Einfacher bedeutet "aus weniger Teilen zusammengesetzt". Die Syntax von Clojure hat weniger Regeln, daher ist sie objektiv einfacher als die von Scala.
Die Lesbarkeit ist jedoch subjektiv. Es kommt hauptsächlich auf Vertrautheit an . Zum Beispiel finde ich ECMAScript, C #, Java, D, Go, C ++ und C fast unverständlich, aber für jemanden, der es gewohnt ist, diese Art von Syntax zu lesen, sind sie ziemlich lesbar. Dieser Teil der Frage kann nicht objektiv oder "aus neutraler Sicht" beantwortet werden.
quelle
Wenn ich in Scala arbeite, gibt es oft eine Phase meiner Entwicklung (insbesondere mit
for
Verständnis), in der ich dafür sorgen muss, dass alle Typen richtig funktionieren. Dies ist ein großes Plus für große Projekte, aber ein definitives Negativ für kleine. Ich hatte erwartet, dass ich Typen einfach vergessen und mich darauf konzentrieren könnte, "die Arbeit zu erledigen" in Clojure, wie ich es vage in Perl oder Awk erinnere, aber bisher hat es für mich nicht so geklappt. Ich habe die Erfahrung gemacht, dass ich beim Versuch, meinen Code auszuführen, Ausnahmen bekomme, anstatt die Typen in der Code- / Kompilierungsphase "zum Laufen zu bringen". Dies ist keine Vereinfachung; Das Problem ist nicht verschwunden, sondern nur in einen gefährlicheren / teureren Teil des Entwicklungszyklus verschoben worden.Die Lisp-ish-Syntax ist sehr einfach. Eine der großen Stärken von Emacs besteht darin, beliebigen Lisp-Code ausführen zu können, indem jederzeit in einem beliebigen Puffer eine spezielle Tastenfolge am schließenden Paren eines Codeblocks gedrückt wird. Die durch einfache Klammern getrennte Natur der Lisp-Syntax macht dies auf eine Weise elegant, die in den meisten anderen Sprachen umständlich wäre (geschweifte Klammern einführen müssen?). Auch die Regelmäßigkeit
(function arg, arg...)
und(operator arg, arg...)
das Denken über Funktionen und Operatoren als erstklassige Bürger und das Denken über anonyme Funktionen sind sehr natürlich, so wie es die Infix-Operatoren anderer Sprachen wie Scala nicht tun.Meine begrenzte Erfahrung mit Scala hindert mich daran zu sagen, dass die Syntax einfacher oder besser lesbar ist. Sicher, es gibt in Clojure eine nicht lispische Syntax, die Makros verwendet, aber ich bin der Meinung, dass diese Makros nur ein kleines Fenster in das imperative Denken in einer Syntax öffnen, die ansonsten sehr funktional ist. Das Auferlegen einer Präferenz für funktionale oder imperative Syntax in der Sprache kann die Dinge vereinfachen. Dafür müsste ich Clojure, Java und Haskell einen Punkt geben.
Meine Sorge um Scala ist die gleiche Sorge, die ich mit C ++ oder Perl hatte (wenn auch in geringerem Maße); Die Syntax der Sprache berücksichtigt verschiedene Denkstile (Haskell und Java). Das Schreiben macht Spaß, kann aber für die Lesbarkeit problematisch sein. Noch während ich das schreibe, erinnere ich mich, dass Clojure domänenspezifische Sprachen unterstützt und frage mich, inwieweit dies meinen Standpunkt untergräbt.
Ihre Frage ist sehr interessant. Letztendlich ist der Vergleich komplex. Nach meinem derzeitigen Kenntnisstand müsste ich jedoch zustimmen, dass die Syntax von Clojure einfacher als die von Scala ist, aber möglicherweise nicht um eine ganze Größenordnung einfacher.
quelle
Und das ist im Grunde die Antwort auf Ihre Frage.
Es ist zwar möglich, DSLs mit einer nicht so lispigen Syntax wie Common Lisps
loop
mithilfe regulärer Makros einzuführen (ich werde Lesermakros davon auslassen ), sie werden jedoch hauptsächlich zur Steuerung der Auswertung verwendet und verwenden weiterhin die reguläre S-Ausdruckssyntax. Ein wichtiges Merkmal ist, dass selbst die komplexerenloop
Makros mit demselben alten Sexpr-Reader gelesen werden können.Es ist zwar richtig, dass Sie etwas über die verschiedenen Makros und die Form der Eingabe lernen müssen, aber Common Lisp's
cond
mit seiner verschachtelten gegenüber Clojurescond
Reduzierung einer Verschachtelungsebene gilt nicht nur für Makros, sondern auch für reguläre Funktionen. Stellen Sie sich eine übliche Funktion vor, die eine zitierte Liste einer bestimmten Struktur als Argument verwendet - Sie müssen sich immer noch an die erwartete Eingabestruktur halten, unabhängig davon, ob die Funktion Code transformiert, eine Art Alist, Plist, einen Baum oder etwas ganz anderes erwartet.Immer wenn Sie auf neue Funktionen stoßen, müssen Sie eine API lernen. Dies würde auch für eine Sprache gelten, die nur eine strikte
function(arg1, arg2, …, argN)
Syntax zulässt - Sie müssten noch lernen, was die erwarteten Argumente sind, welche Nebenwirkungen auftreten und wie die Ausgabe einer bestimmten Funktion ist.Was einfacher ist , über Lisp zu einer Sprache wie Maßstab verglichen Syntax, ist , dass alles vertritt mehr oder weniger die gleiche, und auch , dass der Code selbst diese Darstellungen und Datenstrukturen (das wäre die Homoikonizität jeder spricht). Dieser Unterschied in der syntaktischen Komplexität wird ziemlich deutlich, wenn Sie versuchen würden, einen Lisp- oder Clojure-Parser und dann einen Scala-Parser zu schreiben. Sie müssen sich mit einer viel komplizierteren Grammatik auseinandersetzen - komplexeren Regeln in Bezug auf Vorrang, Leerzeichen, Mehrdeutigkeiten, mehr Ausnahmen usw.
quelle
Aus der Wikipedia- Definition :
Da Clojure ein Lisp ist, haben Sie S-Ausdrücke + die Liste der Lesermakros und das ist alles.
In Scala gibt es Klassen, Fallklassen, implizites Lambda mit _, implizites Schlüsselwort, Merkmale, generische Anmerkungen, Varianzanmerkungen usw.
Clojure hat eine einfachere Syntax, da Features als Makros oder Sonderformen implementiert werden können. Dies ist mit Scala nicht möglich. In diesem Fall müssen Sie Syntax hinzufügen, um einige Funktionen zu unterstützen.
quelle
Makros sind keine Syntax.
Das Argumentieren der Komplexität von Ökosystemen oder Bibliotheken ist eine völlig andere Diskussion.
quelle