Ist die Syntax von Clojure wirklich einfacher als die von Scala? [geschlossen]

8

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?

Amogh Talpallikar
quelle
6
Wenn Sie sich den Scala-Standard ansehen, ist seine Grammatik 7 Seiten lang. So sehr ich Scala auch mag, es hat keine einfachere Syntax als lisp.
Daniel Gratzer

Antworten:

18

Welche Syntax ist aus neutraler Sicht einfacher und lesbarer?

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.

Jörg W Mittag
quelle
5
+1: "Lesbarkeit ist jedoch subjektiv. Es kommt hauptsächlich auf Vertrautheit an.": Richtig. Ich habe in letzter Zeit mit Scheme und Common Lisp gespielt (ich bin kein Experte in beiden), und ich verstehe nicht, warum ihre Syntax als schwer lesbar angesehen wird: Es ist sehr einfach, sich daran zu gewöhnen.
Giorgio
Die Syntax hat weniger Regeln, aber die Lernkurve bleibt gleich. Sie müssen immer noch verschiedene Makros lernen, so wie Sie verschiedene Konstrukte lernen müssen. Auch wenn sie mit einer Reihe von Symbolen geschrieben sind.
Amogh Talpallikar
Ja, aber die Frage betraf die Syntax, nicht die Semantik. Wenn Sie das wissen möchten, sollten Sie Ihre Frage klären.
Jörg W Mittag
1
+1: Dies ist eine gute Antwort auf die Frage des OP. Interessanterweise ist die Vorstellung, dass die Lesbarkeit völlig subjektiv ist, ein weit verbreiteter Mythos. Es ist logisch anzunehmen, dass bei ähnlichen Erfahrungen mit zwei verschiedenen Sprachen eine Sprache zumindest statistisch messbar besser lesbar sein könnte als die andere. (Betrachten Sie zum Beispiel jene esoterischen Sprachen, die sehr unlesbar sind, selbst wenn Sie sie recht gut kennen.) Leider sind mir keine Studien zu diesem Thema bekannt.
Kramii
1
@Kramii: Ich habe langjährige Erfahrung mit C ++ und einige Monate Erfahrung mit Common Lisp und finde CL viel besser lesbar als C ++. Dies zeigt entweder, dass Common Lisp objektiv viel besser lesbar ist als C ++, oder dass meine Argumentation näher an der Funktionsweise von CL liegt. Oder vielleicht beweist es einfach gar nichts.
Giorgio
4

Wenn ich in Scala arbeite, gibt es oft eine Phase meiner Entwicklung (insbesondere mit forVerstä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.

GlenPeterson
quelle
3

Obwohl wir sie mit derselben Klammernsyntax schreiben

Und das ist im Grunde die Antwort auf Ihre Frage.

Wir müssen lernen, wie jeder funktioniert.

Es ist zwar möglich, DSLs mit einer nicht so lispigen Syntax wie Common Lisps loopmithilfe 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 komplexeren loopMakros 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 condmit seiner verschachtelten gegenüber Clojures condReduzierung 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.

danlei
quelle
3

Aus der Wikipedia- Definition :

In der Informatik ist die Syntax einer Programmiersprache das Regelwerk, das die Kombinationen von Symbolen definiert, die als korrekt strukturierte Programme in dieser Sprache gelten

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.

Simon Bergot
quelle
-1

Makros sind keine Syntax.

Das Argumentieren der Komplexität von Ökosystemen oder Bibliotheken ist eine völlig andere Diskussion.

Dave Newton
quelle