Blokuj komentarze w Clojure

119

Jak skomentować wiele linii w Clojure?

unj2
źródło

Odpowiedzi:

145

Właściwie jest sposób!


(comment

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

Check me out! )

Po prostu zawiń swoje komentarze w (komentarz ..) :)

Baw się dobrze!

Rayne
źródło
4
Myślałem, że tęsknię za moim # || #, ale to jest o wiele lepsze.
unj2
4
Mam nadzieję, że dobrze się bawisz z Clojure. :)
Rayne,
14
Słowo ostrzeżenia: wydaje się, że wszystko, co znajduje się w (komentarzu ...), musi mieć odpowiednią formę; np. (komentarz hello: world) jest w porządku, ale (comment hello: world) daje wyjątek. [Edytuj:] Wygląda na to, że powinienem był przeczytać odpowiedź Grega Hewgilla przed opublikowaniem tego komentarza ... no cóż, i tak zostawię to na wypadek, gdyby ktoś zrobił to samo co ja.
paul
19
Słowo ostrzeżenia - makro (komentarz) rozwija się do zera. Użyj #_, aby skomentować pojedynczy formularz lub #_ (komentarz ...), aby skomentować wiele formularzy bez wstawiania zera.
traktuj dobrze swoje mody
Pamięta mi to makro: stackoverflow.com/questions/3732173/…
Felipe
100

Clojure obsługuje #_makro czytnika, które całkowicie pomija następny formularz. Jest to wspomniane na stronie o Clojure Reader . Istnieje również makro komentarza, które ma podobny efekt, ale jest inaczej zaimplementowane.

Oba powyższe wymagają, aby rzecz, którą komentujesz, była inaczej składniowo poprawnym wyrażeniem S.

Niektóre dialekty Lisp mają wieloliniowy komentarz, który może zawierać dowolny tekst, ale nie widzę takiego dla Clojure.

Greg Hewgill
źródło
20
Wielowierszowy formularz komentarza Clojure zawierający dowolny tekst nie istnieje. Przesłałem poprawkę dodającą # | ...... | # komentarze, ale została odrzucona jako niepożądana funkcja. Dlatego jest mało prawdopodobne, że zostanie dodany w najbliższym czasie.
amalloy
5
@amalloy: Jakie było uzasadnienie? Po prostu niepotrzebne, czy był sprzeciw?
Ted
2
Często piszę obszerne komentarze naśladując umiejętny styl programowania. Po prostu używam emacsa do ponownego przepływu komentarzy wielowierszowych (w *scratch*buforze po prostu wpisz jakieś śmieci po ; ;;lub ;;;w wielu wierszach, ustaw kursor na pierwszym słowie po średniku i naciśnij Meta-Q).
Reb
25

Podwójne cudzysłowy (literał ciągu znaków) pozwalają na dodanie dowolnego tekstu (nie tylko odpowiednich formularzy S):

(comment "

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

")
Ivan Sviatenko
źródło
4
niezła sztuczka, która zadziałała dla mnie! Ale jak to możliwe, że nie trzeba uciekać przed cytatami z „Hello World”?
maraton
6
To tylko szczęście. Przykład Ivana składa się z 4 form: pierwsza forma to ciąg, druga forma to symbol Hello, trzecia forma to symbol World, a czwarta forma to kolejny ciąg. commentpo prostu ignoruje wszystkie formularze. W tym przykładzie mamy szczęście, że Hello, Worldjest to traktowane jako prawne zamknięcie. Nie działa z dowolnym tekstem. Na przykład (comment "print("/foo")")umrze z błędem Invalid token: /foo.
John Wiseman
17

Inne przykłady są świetne, chciałbym tylko dodać jeszcze jedną sztuczkę:

Czasami chcesz skomentować kilka wierszy kodu, ale nadal kompilator kompiluje go i zgłasza wszelkie błędy (np. Zestaw poleceń w przestrzeni nazw najwyższego poziomu, którą planujesz wykonać później w REPL).

W tym przypadku lubię zawijać kod, (fn [] .....)co oznacza, że ​​nadal jest kompilowany, po prostu nie jest wywoływany.

mikera
źródło
9

Podczas używania emacsa i cydru jest polecenie, M-x comment-regionktórego często używam.

claj
źródło
2

W Emacsie możesz użyć polecenia M-;(skrótu do M-x comment-dwim). Spowoduje to skomentowanie lub odkomentowanie dowolnego zaznaczonego obszaru tekstu / kodu, więc jeśli cała funkcja lub zestaw funkcji jest uwzględniona w regionie, możesz dość łatwo skomentować lub odkomentować ten region. Podręcznik referencyjny Emacsa dla tej funkcji M-;można znaleźć tutaj .

MLev
źródło
2

Znam wiele sposobów:

Pierwszym z nich jest użycie makra komentarza : nie ocenia ono tylko całego kodu wewnątrz treści komentarza (ale nadal sprawdza, czy nawiasy są wyważone). Jeśli znasz swój sposób na paredit, nie zajmie to dużo czasu, jeśli zechcesz skomentować kilka telefonów z seksem.

(comment 
 (println 1))

Jednak nadal będzie sprawdzać dopasowanie w nawiasach. Więc jeśli masz niezrównoważony nawias, kod nie będzie się kompilował (dawał java.lang.RuntimeException: EOF while reading).

Innym sposobem jest użycie #_(aka discard makro): odrzuci następny sexp, co osobiście wolę (szybsze pisanie i normalnie robię to na sexpsach, kiedy muszę debugować):

#_(println 1)

Sprawdza również niedopasowane ograniczniki: więc jeśli masz niezrównoważony nawias, nie będzie się również kompilował.

Wreszcie, istnieje ;znak, który skomentuje linię (podobnie jak funkcja komentarzy w innych językach), a kompilacja całkowicie ją zignoruje. Jeśli chcesz skomentować wiele wierszy, musisz poprzedzić wszystkie wiersze znakiem; , które zwykle są kłopotliwe, ale zazwyczaj edytory tekstu robią to za Ciebie za pomocą polecenia po zaznaczeniu wielu wierszy.

;  (println 1)
;  (println 1 also won't break
Rodrigo Flores
źródło
0

W przypadku długiego bloku komentarzy, makra #_ lub (komentarz ...) nie działały tak, jak zastrzeżono, wtedy zrobiłem blok komentarza z VSCODE (OS X).

  1. Podświetl blok komentarza.
  2. naciśnij polecenie + shift + p w vscode.
  3. znajdź „Dodaj komentarz do linii”
madeinQuant
źródło