在Clojure中阻止评论


Answers:


145

其实有办法!


(comment

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

Check me out! )

只需在(comment ..)中加上您的评论即可:)

玩得开心!


4
我以为id想念我的#||#,但是这样更好。
unj2

4
希望您能和Clojure一起玩。:)
Rayne

14
提一个警告:似乎(comment ...)内部的任何内容都必须是正确的形式;例如(comment hello:world)可以,但是(comment hello:world)会产生异常。[编辑:]似乎我应该在发布此评论之前已经阅读了格雷格·休吉尔(Greg Hewgill)的答案...哦,好吧,我会把它保留下来,以防有人做我做的同样的事情。
保罗,

19
一个警告词-(comment)宏扩展为nil。使用#_注释单个表单,或#_(comment ...)注释多个表单而不插入nil。
好好对待您的mod,

它会记住我这个宏:stackoverflow.com/questions/3732173/...
费利佩

100

Clojure支持一个#_reader宏,该宏完全跳过下一个表单。关于Clojure Reader的页面上提到了这一点。还有评论宏,其作用类似,但实现方式不同。

以上两种情况都要求您注释掉的东西在语法上是正确的S表达式。

一些Lisp方言具有多行注释,可以包含任意文本,但是我看不到Clojure的注释。


19
不存在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
真是运气。Ivan的示例解析为4种形式:第一种形式是字符串,第二种形式是symbol Hello,第三种形式是symbol World,第四种形式是另一个字符串。 comment只是忽略所有形式。因此,在示例中,我们很幸运地将其Hello, World解析为合法的伪造品。它不适用于任意文本。例如,(comment "print("/foo")")将因错误而死亡Invalid token: /foo
John Wiseman

17

其他示例很棒,我想再添加一个技巧:

有时您想注释掉几行代码,但仍然让编译器对其进行编译并报告任何错误(例如,您计划稍后在REPL上执行的顶级名称空间中的一组命令)。

在这种情况下,我喜欢包装代码,(fn [] .....)这意味着仍然可以编译它,而不会被调用。



9

当使用emacs和cider时,有一个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)。

另一种方法是使用#_(aka丢弃宏):它将丢弃下一个sexp,这是我个人更喜欢的方式(输入速度更快,通常我必须在调试时在sexps上这样做):

#_(println 1)

它还检查不匹配的定界符:因此,如果您的括号不平衡,则也不会编译。

最后,有一个;字符将注释该行(类似于其他语言的注释功能),并且编译器将完全忽略它。如果要注释多行,则需要在所有行之前添加;。,这通常很麻烦,但通常,文本编辑器会在选择多行后用命令为您完成此操作。

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

0

对于较长的注释块,宏#_或(comment ...)不能正常工作,然后我使用VSCODE(OS X)进行了注释块。

  1. 突出显示注释框。
  2. 在vscode中按Command + Shift + P。
  3. 找到“添加行注释”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.