Kommentare in Clojure blockieren

119

Wie kommentiere ich mehrere Zeilen in Clojure?

unj2
quelle

Antworten:

145

Eigentlich gibt es einen Weg!


(comment

(defn hey [] ("Hey there!"))

Check me out! )

Wickeln Sie einfach Ihre Kommentare in (Kommentar ..) :)

Habe Spaß!

Rayne
quelle
4
Ich dachte, ich vermisse mein # || #, aber das ist viel besser.
Unj2
4
Ich hoffe du hast Spaß mit Clojure. :)
Rayne
14
Ein Wort der Vorsicht: Es scheint, als müsste alles, was sich in einem (Kommentar ...) befindet, eine richtige Form haben. zB (Kommentar Hallo: Welt) ist in Ordnung, aber (Kommentar Hallo: Welt) ergibt eine Ausnahme. [Bearbeiten:] Es scheint, als hätte ich die Antwort von Greg Hewgill lesen sollen, bevor ich diesen Kommentar gepostet habe ... na ja, ich werde es trotzdem belassen, falls jemand das Gleiche tut wie ich.
Paul
19
Ein Wort der Warnung - das (Kommentar-) Makro wird auf Null erweitert. Verwenden Sie #_, um ein einzelnes Formular zu kommentieren, oder #_ (Kommentar ...), um mehrere Formulare zu kommentieren, ohne eine Null einzufügen.
Behandle deine Mods gut
Es erinnert mich an dieses Makro: stackoverflow.com/questions/3732173/…
Felipe
100

Clojure unterstützt ein #_Lesemakro, das das nächste Formular vollständig überspringt. Dies wird auf der Seite über den Clojure Reader erwähnt . Es gibt auch das Kommentarmakro, das einen ähnlichen Effekt hat, aber anders implementiert ist.

Beides erfordert, dass das, was Sie auskommentieren, ansonsten ein syntaktisch korrekter S-Ausdruck ist.

Einige Lisp-Dialekte haben einen mehrzeiligen Kommentar, der beliebigen Text enthalten kann, aber ich sehe keinen für Clojure.

Greg Hewgill
quelle
19
Ein mehrzeiliges Clojure-Kommentarformular für beliebigen Text existiert nicht. Ich habe einen Patch mit # | ...... | # Kommentaren eingereicht, der jedoch als nicht erwünschte Funktion abgelehnt wurde. Es ist also unwahrscheinlich, dass es bald hinzugefügt wird.
Amalloy
5
@amalloy: Was war das Grundprinzip? Nur nicht nötig oder gab es einen Einwand?
Ted
2
Ich schreibe oft lange Kommentare in einer Nachahmung des literarischen Programmierstils. Ich verwende nur Emacs, um mehrzeilige Kommentare erneut zu fließen (geben Sie im *scratch*Puffer einfach etwas Junk nach ; ;;oder ;;;in mehreren Zeilen ein, setzen Sie den Cursor auf das erste Wort nach den Semikolons und drücken Sie Meta-Q).
Reb.Cabin
25

Doppelte Anführungszeichen (String-Literal) ermöglichen das Hinzufügen von beliebigem Text (nicht nur richtige S-Formulare):

(comment "

public class HelloWorld {
    public static void main(String[] args) {
        System.out.print("Hello, World");
        System.out.println();
    }
}

")
Ivan Sviatenko
quelle
4
schöner Trick, der bei mir funktioniert hat! Aber wie ist es möglich, dass die Zitate auf "Hello World" nicht maskiert werden müssen?
Marathon
6
Es ist nur Glück. Iwans Beispiel wird in vier Formen unterteilt: Die erste Form ist eine Zeichenfolge, die zweite Form ist das Symbol Hello, die dritte Form ist das Symbol Worldund die vierte Form ist eine weitere Zeichenfolge. commentignoriert einfach alle Formen. In dem Beispiel haben wir das Glück, dass es Hello, Worldals legale Clojure analysiert wird. Es funktioniert nicht mit beliebigem Text. Zum Beispiel (comment "print("/foo")")wird mit dem Fehler sterben Invalid token: /foo.
John Wiseman
17

Andere Beispiele sind großartig, ich möchte nur noch einen Trick hinzufügen:

Manchmal möchten Sie einige Codezeilen auskommentieren, aber dennoch vom Compiler kompilieren lassen und Fehler melden (z. B. eine Reihe von Befehlen in einem Namespace der obersten Ebene, die Sie später auf der REPL ausführen möchten).

In diesem Fall möchte ich den Code umschließen, (fn [] .....)was bedeutet, dass er immer noch kompiliert wird und einfach nicht aufgerufen wird.

mikera
quelle
9

Wenn M-x comment-regionich Emacs und Cider benutze, gibt es einen Befehl, den ich oft benutze.

claj
quelle
2

In Emacs können Sie den Befehl M-;(die Verknüpfung für M-x comment-dwim) verwenden. Es markiert oder kommentiert jeden markierten Bereich von Text / Code. Solange Ihre gesamte Funktion oder Ihr Funktionssatz in der Region enthalten ist, können Sie diesen Bereich ganz einfach kommentieren oder auskommentieren. Das Emacs-Referenzhandbuch für die Funktion M-;finden Sie hier .

MLev
quelle
2

Ich kenne mehrere Möglichkeiten:

Zuerst wird das Kommentarmakro verwendet : Es wertet nur nicht den gesamten Code im Kommentartext aus (es wird jedoch weiterhin nach ausgewogenen Klammern / Klammern gesucht). Wenn Sie sich mit paredit auskennen, wird es nicht lange dauern, bis Sie ein paar Sexp-Anrufe kommentieren möchten.

(comment 
 (println 1))

Es wird jedoch weiterhin geprüft, ob die Klammern übereinstimmen. Wenn Sie also eine unausgeglichene Klammer haben, wird Ihr Code nicht kompiliert (ergibt java.lang.RuntimeException: EOF while reading).

Eine andere Möglichkeit ist die Verwendung #_(auch bekannt als das Makro zum Verwerfen): Es wird das nächste Sexp verwerfen, was ich persönlich bevorzuge (schneller zu tippen und normalerweise mache ich das auf Sexps, wenn ich debuggen muss):

#_(println 1)

Es wird auch nach nicht übereinstimmenden Trennzeichen gesucht. Wenn Sie also eine unausgeglichene Klammer haben, wird es auch nicht kompiliert.

Schließlich gibt es das ;Zeichen, das die Zeile kommentiert (ähnlich wie die Kommentarfunktion in anderen Sprachen), und die Kompilierung ignoriert sie vollständig. Wenn Sie mehrere Zeilen kommentieren möchten, müssen Sie allen Zeilen voranstellen. Dies ist normalerweise ein Ärger, aber normalerweise erledigen Texteditoren dies mit einem Befehl für Sie, nachdem Sie mehrere Zeilen ausgewählt haben.

;  (println 1)
;  (println 1 also won't break
Rodrigo Flores
quelle
0

Für einen langen Kommentarblock funktionierten die Makros #_ oder (Kommentar ...) nicht so proprietär, dann habe ich einen Kommentarblock mit VSCODE (OS X) erstellt.

  1. Markieren Sie den Kommentarblock.
  2. Drücken Sie Befehl + Umschalt + p in vscode.
  3. finde "Zeilenkommentar hinzufügen"
madeinQuant
quelle