Блокировать комментарии в Clojure


Ответы:


145

Собственно, выход есть!


(comment

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

Check me out! )

Просто оберните свои комментарии в (комментарий ..) :)

Радоваться, веселиться!


4
Я думал, что мне не хватает моего # || #, но так лучше.
unj2

4
Надеюсь, вам нравится Clojure. :)
Rayne

14
Небольшое предостережение: кажется, что все, что находится внутри (комментария ...), должно быть правильной формы; например, (comment hello: world) нормально, но (comment hello: world) выдает исключение. [Edit:] Похоже, я должен был прочитать ответ Грега Хьюджилла, прежде чем размещать этот комментарий ... ну, я все равно оставлю его на случай, если кто-то сделает то же самое, что и я.
Павел

19
Предупреждение - макрос (комментарий) заменяется на ноль. Используйте #_, чтобы прокомментировать одну форму, или #_ (комментарий ...), чтобы комментировать несколько форм, не вставляя ноль.
хорошо относитесь к своим модам

Он помнит мне этот макрос: stackoverflow.com/questions/3732173/…
Фелипе

100

Clojure поддерживает #_макрос чтения, который полностью пропускает следующую форму. Об этом упоминается на странице о Clojure Reader . Также существует макрос комментария, который имеет аналогичный эффект, но реализован по-другому.

Оба вышеперечисленного требуют, чтобы комментируемая вами вещь была синтаксически правильным S-выражением.

Некоторые диалекты Лиспа имеют многострочный комментарий, который может содержать произвольный текст, но я не вижу его для Clojure.


20
Многострочной формы комментария с произвольным текстом Clojure не существует. Я отправил патч, добавляющий # | ...... | # комментариев, но он был отклонен как нежелательная функция. Так что вряд ли он будет добавлен в ближайшее время.
amalloy

5
@amalloy: В чем было обоснование? Просто не нужно, или были возражения?
Ted

2
Я часто пишу длинные комментарии, имитируя грамотный стиль программирования. Я просто использую emacs для повторного заполнения многострочных комментариев (в *scratch*буфере просто набираю мусор после ; ;;или ;;;на нескольких строках, помещаю курсор на первое слово после точки с запятой и нажимаю Meta-Q).
Reb.Cabin

25

Двойные кавычки (строковый литерал) позволяют добавлять произвольный текст (не только правильные S-формы):

(comment "

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

")

4
хороший трюк, который у меня сработал! Но как это возможно, что кавычки в "Hello World" не нужно экранировать?
марафон

6
Это просто удача. Пример Ивана разбирается на 4 формы: первая форма - это строка, вторая форма - это символ Hello, третья форма - это символ Worldи четвертая форма - это еще одна строка. commentпросто игнорирует все формы. Итак, в этом примере нам повезло, что он Hello, Worldразбирается как законное закрытие. Не работает с произвольным текстом. Например, (comment "print("/foo")")умрет с ошибкой Invalid token: /foo.
Джон Уайзман,

17

Другие примеры отличные, я просто хочу добавить еще одну хитрость:

Иногда вы хотите закомментировать несколько строк кода, но все же компилятор скомпилирует его и сообщит о любых ошибках (например, о наборе команд в пространстве имен верхнего уровня, которые вы планируете выполнить позже в REPL).

В этом случае мне нравится заключать код в оболочку, (fn [] .....)что означает, что он все еще компилируется, он просто не вызывается.



9

При использовании emacs и сидра M-x comment-regionя часто использую команду .


2

В Emacs вы можете использовать команду M-;(ярлык для M-x comment-dwim). Он будет комментировать или раскомментировать любую отмеченную область текста / кода, поэтому, пока вся ваша функция или набор функций включены в область, вы можете легко прокомментировать или раскомментировать эту область. Справочное руководство Emacs для этой функции M-;можно найти здесь .


2

Я знаю несколько способов:

Во-первых, используется макрос комментария : он только не оценивает весь код внутри тела комментария (но по-прежнему проверяет наличие сбалансированных скобок / скобок). Если вы знаете свой путь с paredit, это не займет много времени, если вы захотите прокомментировать несколько вызовов sexp.

(comment 
 (println 1))

Однако он все равно будет проверять соответствие скобок. Поэтому, если у вас несбалансированные круглые скобки, ваш код не будет компилироваться (даваяjava.lang.RuntimeException: EOF while reading ).

Другой способ - использовать #_(также известный как макрос discard): он отбрасывает следующий sexp, что я лично предпочитаю (быстрее набирать, и обычно я делаю это на sexps, когда мне нужно отлаживать):

#_(println 1)

Он также проверяет наличие несовпадающих разделителей: поэтому, если у вас несбалансированные круглые скобки, он также не будет компилироваться.

Наконец, есть ;символ, который будет комментировать строку (аналогично функциям комментариев на других языках), и компиляция полностью его проигнорирует. Если вы хотите прокомментировать несколько строк, вам нужно добавить перед всеми строками; , которые обычно доставляют хлопот, но обычно текстовые редакторы сделают это за вас с помощью команды после выбора нескольких строк.

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

0

Для длинного блока комментариев макросы #_ или (комментарий ...) не работали должным образом, затем я сделал блок комментариев с помощью VSCODE (OS X).

  1. Выделите блок комментария.
  2. нажмите command + shift + p в vscode.
  3. найти "Добавить комментарий к строке"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.