Clojureでコメントをブロックする


119

Clojureで複数の行にコメントするにはどうすればよいですか?

回答:


145

実は道があります!


(comment

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

Check me out! )

コメントを(コメント..)で囲むだけです:)

楽しんで!


4
idは私の#||#を逃したと思ったが、これははるかに良い。
unj2 2009

4
Clojureをお楽しみいただければ幸いです。:)
レイン2007

14
注意:(コメント...)の内部は適切な形式である必要があるようです。たとえば、(comment hello:world)は問題ありませんが、(comment hello:world)は例外を生成します。[編集:]このコメントを投稿する前に、Greg Hewgillの回答を読んだほうがいいようです。
ポール

19
警告の言葉-(コメント)マクロはnilに展開されます。#_を使用して単一のフォームにコメントを付けるか、#_(コメント...)を使用してnilを挿入せずに複数のフォームにコメントを付けます。
MODを

それは私にこのマクロを覚えている:stackoverflow.com/questions/3732173/...
フェリペ

100

Clojure #_は、次のフォームを完全にスキップするリーダーマクロをサポートしています。これはClojureリーダーに関するページで言及されています。同様の効果を持つコメントマクロもありますが、実装方法が異なります。

上記の両方とも、コメントアウトしているものが構文的に正しいS式であることを必要とします。

一部のLisp方言には、任意のテキストを含むことができる複数行のコメントがありますが、Clojureには表示されません。


19
Clojureの複数行の任意のテキストコメントフォームは存在しません。#| ...... |#コメントを追加してパッチを送信しましたが、目的の機能ではないため拒否されました。したがって、すぐに追加される可能性はほとんどありません。
アマロイ2011

5
@amalloy:理論的根拠は何でしたか?必要ないだけなのか、それとも反対意見があったのか?
2013年

2
私は、文字通りのプログラミングスタイルを模倣して、長いコメントを書くことがよくあります。私はemacsを使用して複数行のコメントをリフローします(*scratch*バッファー内で、複数行の後ろ; ;;または;;;複数行にジャンクを入力し、セミコロンの後の最初の単語にカーソルを置いて、を押しますMeta-Q)。
Reb.Cabin 2013年

25

二重引用符(文字列リテラル)を使用すると、適切なSフォームだけでなく、任意のテキストを追加できます。

(comment "

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

")

4
私のために働いた素敵なトリック!しかし、「Hello World」の引用をエスケープする必要がないのはなぜでしょうか。
マラソン

6
それはただの運です。Ivanの例は4つの形式に解析されます。最初の形式は文字列、2番目の形式はシンボルHello、3番目の形式はシンボルWorld、4番目の形式は別の文字列です。 commentすべてのフォームを無視します。したがって、この例でHello, Worldは、合法的なクロジュールとして解析できるのは幸運です。任意のテキストでは機能しません。たとえば(comment "print("/foo")")、エラーで死んでしまいますInvalid token: /foo
ジョンワイズマン2017年

17

他の例は素晴らしいです、私はちょうどもう1つのトリックを追加したいと思います:

場合によっては、数行のコードをコメントアウトしたいが、それでもコンパイラにコードをコンパイルしてエラーを報告させる(たとえば、後でREPLで実行する予定のトップレベルのネームスペースにある一連のコマンド)。

この場合、コードをラップするのが好きです(fn [] .....)。つまり、コードはコンパイルされますが、呼び出されません。



9

emacsとciderを使用しているときに、M-x comment-regionよく使用するコマンドがあります。


2

Emacsでは、コマンドM-;(のショートカットM-x comment-dwim)を使用できます。テキスト/コードのマークされた領域をコメント化またはコメント解除します。そのため、関数全体または関数セットが領域に含まれている限り、その領域を簡単にコメント化またはコメント解除できます。機能のためのEmacsのリファレンスマニュアルをM-;見つけることができるここに


2

私が知っているいくつかの方法があります:

1つ目はコメントマクロの使用です。コメントボディ内のすべてのコードを評価するだけではありませ(ただし、括弧/括弧のバランスが取れているかどうかをチェックします)。pareditの使い方がわかっている場合は、sexpの呼び出しにコメントを付けてもそれほど時間はかかりません。

(comment 
 (println 1))

ただし、括弧の一致は引き続きチェックされます。したがって、括弧のバランスが取れていない場合、コードはコンパイルされません(yielding 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. vscodeでcommand + shift + pを押します。
  3. 「行コメントを追加」を見つける
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.