Lesbarkeit von S-Ausdrücken

9

Kurz gesagt und für diejenigen, die es nicht wussten, werden Lisp-Funktionen / Operatoren / Konstrukte alle einheitlich so genannt:

(function arg0 arg1 ... argN)

Also, was in einer C-ähnlichen Sprache würden Sie ausdrücken als

if (a > b && foo(param))

verwandelt sich in einen Lisp Sexp wie

(if (and (> a b) (foo param)))

. Wenn die Dinge realer / komplizierter werden, tun dies für mich auch die entsprechenden S-Ausdrücke.

Ich bin mir bewusst, dass dies höchstwahrscheinlich eine subjektive Frage ist, aber - ist dies für viele Lisp-Hacker ein kleiner Ärger, mit dem man sich immer befassen muss?

Oder gewöhnt man sich früher oder später meistens an diese (fehlende) Syntax?

Ist das Hinzufügen von Bruchkanten (die Sie meistens nicht in Ihrem C-Äquivalent hinzufügen würden) zur besseren Lesbarkeit auf jeden Fall eine gute Idee, insbesondere auf lange Sicht? Alle anderen Vorschläge wären willkommen.

vemv
quelle
1
Haben Sie versucht, Lisp in einer Lisp-fähigen Umgebung wie Emacs zu verwenden? Ich würde es nicht anders anfassen.
David Thornley
Nein, habe ich nicht, in welchen Formen kann es meine Lisp-Erfahrung verbessern?
vemv
Das Schreiben kurzer Funktionen ist ebenfalls sehr wichtig, obwohl ich nur ein bisschen mit Clojure gespielt habe.
Kevin
3
In einer guten Lisp-Umgebung ignorieren Sie die Klammern und lesen die Struktur durch den Einzug. Wie Sie bemerkt haben, ist das Lesen der Struktur durch Zählen von Klammern wirklich sehr, sehr ärgerlich.
David Thornley

Antworten:

8

Wie analysierst du?

if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}

Der Analysebaum sieht wahrscheinlich so aus

if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse

hmm ... lassen Sie uns diesen Baum in eine Liste mit Präfixnotation serialisieren

if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))

Dieses Analysebaumformat ist ziemlich einfach zu manipulieren, aber ich habe ein Problem. Ich hasse Trennzeichen. Ich mag Terminatoren. Gleichzeitig streue ich gerne in Leerzeichen.

if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))

hmm ... das zusätzliche Leerzeichen erschwert das Parsen bestimmter Dinge ... Vielleicht könnte ich einfach eine Regel aufstellen, dass der Baum als (Wurzelblatt Blattblatt) dargestellt wird.

(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)

Nun meine Serialisierung eines Parse - Baums ist Lisp (Umbenennungsfunktion anzuwenden, und dies wahrscheinlich läuft). Wenn ich Programme möchte, die Programme schreiben, ist es nett, nur Analysebäume zu manipulieren.

Dies ist nicht ganz der Grund, warum S-Ausdrücke entstanden sind, aber es wurde früh erkannt und es ist eine Funktion, die Lisp-Programmierer verwenden. Unsere Programme sind in gewissem Sinne vorab analysiert, und das Schreiben von Programmen zum Bearbeiten von Programmen ist aufgrund des Formats ziemlich einfach. Deshalb wird der Mangel an Syntax manchmal als Stärke angesehen.

Verwenden Sie jedoch, wie David sagte, einen S-Ausdruck-fähigen Editor. Es ist wahrscheinlicher, dass Sie den Überblick über eine schließende Klammer in einem S-Ausdruck verlieren als über eine schließende Klammer in XML ( </foo>schließt nur <foo>, aber der rechte Paren schließt JEDEN S-Ausdruck). Bei Schlägern werden die meisten Probleme durch die Verwendung eckiger Klammern für einige Ausdrücke in Verbindung mit einem guten Einrückungsstil behoben.

Die Lisp-Version:

(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))

Nicht so schlecht.

ccoakley
quelle
Listen sind zweifellos vielseitiger und leistungsfähiger als exprs + -Anweisungen. Emacs zu versuchen (oder was noch?) Ist verlockend, aber das letzte Mal, als ich es ausprobiert habe, hat mich sehr erschreckt. Was bringt Sexp Awareness genau?
vemv
Einfaches Zeug: Sie prägen ein Highlight auf nahe und offene Parens (oder heben ganze S-Ausdrücke unterschiedlich hervor). Sie haben schöne Einrückungsregeln. Emacs hat andere Dinge, aber sie sind wahrscheinlich nicht so wichtig für die Lesbarkeit. Es gibt andere S-Expression-fähige Editoren. Sie nicht brauchen Emacs. Wenn Ihnen Emacs Angst macht, probieren Sie die Bundles für Textmate, Sublime usw. aus. Sobald Ihr Editor die Lesbarkeit verbessert, werden die Dinge etwas einfacher. Ich mache die meisten lispy Sachen in Schlägern, die eckige Klammern überall dort erlauben, wo Parens verwendet werden könnten. Das Hochschalten hilft bei der Lesbarkeit.
Ccoakley
1
Verwenden Sie nebenbei verschachtelte Lets, Definitionen usw., um das Zeug in kleinere Teile zu zerlegen. Wenn Sie keinen guten Namen für ein Stück finden können, behandeln Sie dies als Warnung vor Ihrem Design. Finden Sie die Balance zwischen zu klein zum Nennen und zu groß zum Lesen.
Ccoakley
Oh, dieser letzte Rat ist ... unvergesslich :) Ich versuche Sublime, während ich das schreibe.
vemv
5

Das Schöne an s-exp ist, dass man sie nach kurzer Zeit nicht mehr sieht. Für die Augen ist es wie Python, ABER der Computer hat den Baum immer noch leicht.

  • Das Einrücken erfolgt also automatisch, es gibt keine Mehrdeutigkeit, Sie müssen nicht zweimal die Tabulatortaste drücken oder ähnliches, wenn Sie einen Block beenden möchten.

  • Wenn Sie einen zufälligen Code auswählen, kann das gesamte Material mit nur einem Befehl Ihres Lieblingseditors leicht eingerückt werden

  • Sie können ganz einfach durch Ihren Code navigieren , zwischen s-exp wechseln, sie austauschen und so weiter mit einem guten Editor

Da die Daten, die Sie bearbeiten, mit denen des von Ihnen geschriebenen Codes übereinstimmen, können Sie Ihren Code auch in derselben Sprache bearbeiten, oder?

Nun, Sie können es tun, das sind Makros, Sie manipulieren den Code, den Sie schreiben, bevor er wie jede andere Liste ausgewertet wird. Deshalb wird gesagt, dass Lisp eine "programmierbare Programmiersprache" ist. Sie schreiben Code, der Ihren Code für Sie schreibt.

Hier ist ein schöner Artikel, der die Natur von Lisp beschreibt und warum Lisp-Programmierer grinsten, wenn sie XML sehen.

Daimrod
quelle