let的绑定向量中的下划线是什么,所以如果我写(let [a blabla _ (println a)] etc....
这个下划线在关键字的位置做了什么?
答案 0 :(得分:12)
下划线是一个有效的符号标识符,您可以通过以下示例代码看到:
(let [_ 1]
(println _))
=> 1
按照惯例,当您拥有一个标识符时,您将无法使用 使用_
,但它不是强制性的。
在样本中发生副作用情况(在您的情况下,println
行返回nil
,因此您不会将其结果绑定到符号)
也会发生在您不需要某些价值观的解构情况。
(let [[a _ _ d] [1 2 3 4]]
(println a))
=> 1
在这种情况下,您对第二个和第三个值不感兴趣,因此标识符_
对于说您不在乎是惯用的。
在常规Clojure中,下划线_
被视为任何其他符号(例如"垃圾")。但是它在某些库中具有特殊含义。例如,在Datomic中,_
被视为"通配符"这可以防止绑定/统一。在clojure.core.match中,_
也被视为通配符。
见:
答案 1 :(得分:3)
下划线是通用忽略符号。
let表单中每个sexp都必须有一个返回值,println
返回nil,所以你可以将它设置为_
告诉别人你忽略了返回并只是调试在那时候。 e.g。
(let [foo (+ 1 2)
_ (println "debug! foo is" foo)
_ (println "more debug!" (+ 1 foo)]
foo)
sexp的每次评估都会将_
设置为返回的值,但不是必需的,所以只需将其读取即可。