38 Stimmen

Lisp-Code-Formatierung

Eine der Personen, die sich die Zeit genommen haben, einen Kommentar zu meine andere Frage über die Clojure/LISP-Syntax wies mich darauf hin, dass ich meinen Beispielcode nicht in der Standard-LISP-Form geschrieben hatte. Er war so freundlich, den Code neu zu schreiben, und das ist eine große Hilfe. Aber es warf eine weitere Frage in meinem Kopf auf. Warum sollte dies:

(if (= a something)
  (if (= b otherthing)
    (foo)))

die Standard-LISP-Formatierung ist, dieser Form vorzuziehen:

(if (= a something)
  (if (= b otherthing)
    (foo)
  )
)

was die Art und Weise ist, wie ich diesen Code naiverweise formatiert hätte, da ich aus der C++-Entwicklung komme. Ich frage mich, ob die letztere Formatierung einen Vorteil hat oder ob es sich nur um einen eingefahrenen Standard handelt (wie eine QWERTY-Tastatur). Ich will nicht argumentieren - es fällt mir nur schwer zu verstehen, warum die erste Form vorzuziehen ist. Die zweite Form hilft mir, die Codestruktur leichter zu erkennen.

0 Stimmen

Anstelle von <pre>(if (= a etwas) (if (= b anderes) (foo))) </pre> sollte man vielleicht <pre> (when (and (= a etwas) (= b anderes)) (foo)) </pre>

41voto

Christian Berg Punkte 13866

Die schließenden Klammern in zusätzlichen Zeilen helfen nicht wirklich dabei, die Struktur des Codes zu erkennen, da man die gleichen Informationen auch aus der Einrückung erhält. Allerdings nimmt die zweite Form fast doppelt so viele Zeilen in Anspruch, so dass Sie beim Lesen des Codes häufiger scrollen müssen.

Und wenn Sie die verschachtelten Klammern genauer untersuchen müssen, hilft Ihnen ein Editor, der die passende Klammer hervorhebt. Dies ist auch einfacher, wenn die passende Klammer nicht zu weit entfernt ist.

Wenn Ausdrücke zu lang und kompliziert werden, um leicht gelesen werden zu können, kann dies auch ein Zeichen dafür sein, dass Sie einen Teil der Funktionalität in eine separate Funktion auslagern sollten.

37voto

Kyle Cronin Punkte 74993

Die Art und Weise, wie Lisp-Code eingerückt wird, ist ähnlich wie der signifikante Leerraum in Python, nur dass er natürlich optional ist. Als Faustregel gilt, dass Sie Elemente in einer Liste vertikal untereinander platzieren, wenn sie sich nicht in derselben Zeile befinden.

(a (b (c (d e)
         (f g))
      (h i j))
   (k l m n))

Ohne auf die Klammern zu achten, können Sie erkennen, dass (d e) y (f g) sind Parameter für c , (c (d e) (f g)) y (h i j) sind Parameter für b y (b (c (d e) (f g)) (h i j)) y (k l m n) sind Parameter für a .

In Ihrem Beispiel müsste es korrekterweise wie folgt formatiert werden:

(if (= a something)
    (if (= b otherthing)
        (foo)))

    ^   ^
  notice how they line up

Jetzt, wo die Einrückungsebene von Bedeutung ist, müssen Sie sich nicht mehr auf ausgleichende Klammern verlassen, um diese Information zu erhalten, und da es kompakter ist, sie in dieselbe Zeile wie die abschließende Anweisung zu setzen, tun Lispianer genau das. Zugegeben, es ist nicht erforderlich, dass Lisp-Code auf diese Weise formatiert wird, aber es ist eine ziemlich standardisierte Konvention, die die Leute benutzen und auf die sie sich verlassen können.

1 Stimmen

Gutes Argument für Leerzeichen und Python. Sie können die Klammern als Hilfsmittel für Ihren Editor betrachten, um die Einrückung zu bestimmen, und sie ansonsten ignorieren. Übrigens, wenn Sie sich an Lisp gewöhnt haben, werden Sie sie nicht mehr "sehen".

1 Stimmen

Ich stimme zu, dass Ihre Art der Einrückung von IF-Formularen sowohl konventioneller als auch ästhetisch vorteilhafter ist als die des OP, was Lisp als Sprachfamilie betrifft, aber die Art des OP ist tatsächlich (und meiner Meinung nach etwas unglücklich) die Clojure-Konvention.

0 Stimmen

Komisch, ich habe gerade in Emacs nachgesehen, und es wird wie im OP mit IF eingerückt, aber mit einem zufälligen Namen wird es so eingerückt, wie ich es oben gemacht habe. Vielleicht ist es etwas Besonderes mit IF, aber die Inkonsistenz ist ärgerlich.

3voto

Xanthir Punkte 17566

Die einfache Antwort ist, dass Ihr Weg nicht der Weg ist, den der Pretty-Printer von Lisp einschlägt. EIN WAHRES FORMAT zu haben, ist immer eine gute Sache für den Code, und das pprint-Makro gibt Ihnen dieses Format in die Sprache eingebaut.

Ja, natürlich, というのも das pprint-Makro existiert, ist es nicht unbedingt notwendig, dass Sie sich an die Standardcodeformatierung halten, denn die Leute können Ihren Code einfach durch pprint laufen lassen und erhalten das, was sie gewohnt sind. Da jedoch alle anderen pprint verwenden oder es manuell annähern, werden Sie es schwer haben, den Code zu lesen, wenn Sie es nicht auf dieselbe Weise tun, und Sie haben kein einfaches Makro, das ihren Code in Ihr bevorzugtes Format umwandelt.

1voto

Amumu Punkte 16676

Sie können Lisp-Code mit dem Paket Sreafctor neu formatieren: Homepage .

Einige Demos:

Verfügbare Befehle:

  • srefactor-lisp-format-buffer Formatierung des gesamten Puffers
  • srefactor-lisp-format-defun Format: Der aktuelle Defun-Cursor befindet sich in
  • srefactor-lisp-format-sexp Format: Format, in dem sich der aktuelle sexp-Cursor befindet.
  • srefactor-lisp-one-line : macht aus dem aktuellen sexp der gleichen Ebene eine Zeile; mit Präfix-Argument rekursiv aus allen inneren sexps eine Zeile.

Die Formatierungsbefehle sind auch auf Common Lisp und Scheme anwendbar.

Wenn es ein Problem gibt, senden Sie bitte einen Fehlerbericht und ich werde es gerne beheben.

0voto

starblue Punkte 53167

Wenn man 10 Klammern zu schließen hat, wird es sehr unhandlich.

Als ich früher Lisp programmierte, ließ ich zur Vereinfachung der Zählung ein Leerzeichen zwischen den schließenden Klammern für öffnende Klammern auf derselben Zeile und dem Rest, etwa so:

(if (= a something)
  (if (= b otherthing)
    (foo) ))

Heutzutage ist das wohl nicht mehr nötig, da die Redakteure hilfreicher sind.

1 Stimmen

Ich denke, das ist eine hilfreiche Konvention; ich werde sie ausprobieren. Das kann bei Code, der häufig bearbeitet wird, sehr hilfreich sein, da man sehen kann, wo der Zeilensplit hingehört.

0 Stimmen

Das ist wirklich ein furchtbarer Ratschlag.

9 Stimmen

Was ist daran so furchtbar?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X