在Clojure中使用下划线是什么让绑定形式?

时间:2015-06-27 22:18:04

标签: clojure

let的绑定向量中的下划线是什么,所以如果我写(let [a blabla _ (println a)] etc.... 这个下划线在关键字的位置做了什么?

2 个答案:

答案 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的每次评估都会将_设置为返回的值,但不是必需的,所以只需将其读取即可。