Blocca commenti in Clojure


119

Come faccio a commentare più righe in Clojure?

Risposte:


145

In realtà, c'è un modo!


(comment

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

Check me out! )

Metti i tuoi commenti in (comment ..) :)

Divertiti!


4
Pensavo mi mancasse il mio # || # ma è molto meglio.
unj2

4
Spero ti stia divertendo con Clojure. :)
Rayne

14
Una parola di cautela: sembra che tutto ciò che è all'interno di un (commento ...) debba essere una forma corretta; eg (comment hello: world) va bene ma (comment hello: world) produce un'eccezione. [Modifica:] Sembra che avrei dovuto leggere la risposta di Greg Hewgill prima di pubblicare questo commento ... vabbè, lo lascerò comunque nel caso qualcuno faccia la stessa cosa che ho fatto io.
paul

19
Una parola di avvertimento: la macro (commento) si espande a zero. Usa #_ per commentare un singolo modulo, o #_ (comment ...) per commentare più moduli senza inserire uno zero.
tratta bene le tue mod


100

Clojure supporta una #_macro del lettore che salta completamente il modulo successivo. Questo è menzionato nella pagina sul Clojure Reader . C'è anche la macro di commento che ha un effetto simile, ma è implementata in modo diverso.

Entrambi i precedenti richiedono che la cosa che stai commentando sia altrimenti un'espressione S sintatticamente corretta.

Alcuni dialetti Lisp hanno un commento su più righe che può contenere testo arbitrario, ma non ne vedo uno per Clojure.


20
Non esiste un modulo di commento a testo arbitrario su più righe Clojure. Ho inviato una patch aggiungendo # | ...... | # commenti, ma è stata rifiutata perché non era una caratteristica desiderata. Quindi è improbabile che venga aggiunto presto.
amalloy

5
@amalloy: qual era la logica? Semplicemente non necessario, o c'era un'obiezione?
Ted

2
Scrivo spesso lunghi commenti imitando uno stile di programmazione letterato. Uso solo emacs per ri-fluire i commenti su più righe (nel *scratch*buffer, digita semplicemente un po 'di spazzatura dopo ; ;;o ;;;su più righe, posiziona il cursore sulla prima parola dopo il punto e virgola e premi Meta-Q).
Reb.Cabin

25

Le virgolette doppie (stringa letterale) consentono di aggiungere testo arbitrario (non solo le forme S appropriate):

(comment "

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

")

4
bel trucco che ha funzionato per me! Ma come è possibile che le virgolette di "Hello World" non debbano essere evitate?
maratona

6
È solo fortuna. L'esempio di Ivan analizza in 4 forme: la prima forma è una stringa, la seconda forma è il simbolo Hello, la terza forma è il simbolo Worlde la quarta forma è un'altra stringa. commentignora solo tutte le forme. Quindi nell'esempio siamo fortunati che Hello, Worldanalizza come chiusura legale. Non funziona con testo arbitrario. Ad esempio, (comment "print("/foo")")morirà con l'errore Invalid token: /foo.
John Wiseman

17

Altri esempi sono fantastici, vorrei solo aggiungere un altro trucco:

A volte si desidera commentare alcune righe di codice, ma è comunque necessario che il compilatore lo compili e segnali eventuali errori (ad esempio un insieme di comandi in uno spazio dei nomi di primo livello che si prevede di eseguire in seguito nella REPL).

In questo caso mi piace avvolgere il codice con il (fn [] .....)che significa che viene comunque compilato, semplicemente non viene chiamato.



9

Quando uso emacs e sidro, c'è un comando M-x comment-regionche uso spesso.


2

In Emacs puoi usare il comando M-; (la scorciatoia per M-x comment-dwim). Commenterà o rimuoverà il commento da qualsiasi regione di testo / codice contrassegnata, quindi, fintanto che l'intera funzione o insieme di funzioni è inclusa nella regione, puoi commentare o rimuovere il commento da quella regione abbastanza facilmente. Il manuale di riferimento di Emacs per la funzione M-;può essere trovato qui .


2

Ci sono diversi modi che conosco:

Il primo è usare la macro di commento : solo non valuta tutto il codice all'interno del corpo del commento (ma controlla ancora per parentesi / parentesi equilibrate). Se conosci la tua strada con paredit, non ci vorrà molto tempo se vuoi commentare alcune chiamate sexp.

(comment 
 (println 1))

Tuttavia, controllerà comunque la corrispondenza tra parentesi. Quindi, se hai parentesi sbilanciate, il codice non verrà compilato (cedendo java.lang.RuntimeException: EOF while reading).

Un altro modo è usare #_(ovvero la macro di scarto): scarterà il prossimo sexp, che è il modo che preferisco personalmente (più veloce da digitare e normalmente lo faccio su sexps quando devo eseguire il debug):

#_(println 1)

Controlla anche la presenza di delimitatori non corrispondenti: quindi se hai parentesi sbilanciate, non verrà compilato.

Infine, c'è il ;carattere che commenterà la riga (simile alla funzionalità di commento di altre lingue) e la compilazione la ignorerà completamente. Se vuoi commentare più righe, devi anteporre a tutte le righe; , che normalmente sono una seccatura, ma di solito gli editor di testo lo faranno per te con un comando dopo aver selezionato più righe.

;  (println 1)
;  (println 1 also won't break

0

Per un lungo blocco dei commenti, le macro #_ o (commento ...) non funzionavano in modo proprietario, quindi ho fatto il blocco dei commenti con VSCODE (OS X).

  1. Evidenzia il blocco dei commenti.
  2. premi command + shift + p in vscode.
  3. trova "Aggiungi commento riga"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.