在Clojure中,符号名称开头的问号是否有任何特殊含义?

时间:2014-09-25 05:51:15

标签: clojure clojurescript

在此示例中(来自here):

(defmethod event-msg-handler :chsk/recv
  [{:as ev-msg :keys [?data]}]
  (logf "Push event from server: %s" ?data)))

其中?datavector?是否有任何目的或表示某些内容?

2 个答案:

答案 0 :(得分:3)

通常,符号中的标点符号是一种命名约定。尾随?通常表示谓词函数或某个布尔标志。

核心API中的示例包括map?number?之类的内容。示例可能如下所示:

=> (filter number? [1 "foo" 2 :bar]) 
(1 2)
=> (remove number? [1 "foo" 2 :bar])
("foo" :bar)
=> (def debug? true)
(when debug? (println "Debugging")

尾随!通常表示发生了某些突变,例如

=>(def an-atom (atom 0))
=> @an-atom 
0
=> (reset! an-atom  10)
=> @an-atom
10

然而,一些图书馆确实附加了更多的意义。例如,cascalog使用前导? !!!来指示查询输出变量的一些不同属性。有关详细信息,请参阅The Cascalog Docs

答案 1 :(得分:0)

问号不会改变Clojure读取或评估符号的方式。包含问号的符号在完全相同的情况下由Clojure处理,而不是符号。

使用?因此,?数据符号只是Sente库作者使用的命名约定。