在Clojure的绑定表单中使用下划线有什么用?

6 clojure

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

Gui*_*ler 13

下划线是有效的符号标识符,您可以通过以下示例代码看到:

(let [_ 1] 
  (println _))
=> 1
Run Code Online (Sandbox Code Playgroud)

按照惯例,当您拥有一个您将不会使用的标识符时,您可以使用_,但这不是强制性的.

发生在样本中的副作用情况(在您的情况下,println行返回,nil因此您不会将其结果绑定到符号)

在您不需要某些值的解构情况下也会发生.

 (let [[a _ _ d] [1 2 3 4]] 
    (println a))
 => 1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您对第二个和第三个值不感兴趣,因此标识符_是说不关心的惯用语.

在常规Clojure中,下划线_被视为任何其他符号(例如"垃圾").但是它在某些库中具有特殊含义.例如,在Datomic中,它_被视为防止绑定/统一的"通配符".在clojure.core.match中,_它也被视为通配符.

看到:


Mar*_*her 4

下划线是通用忽略符号。

let 形式中的每个 sexp 都必须有一个返回值,并且println返回 nil,因此您可以将其设置_为告诉人们您忽略返回并仅在此时进行调试。例如

(let [foo (+ 1 2)
      _   (println "debug! foo is" foo)
      _   (println "more debug!" (+ 1 foo)]
  foo)
Run Code Online (Sandbox Code Playgroud)

sexp 的每次评估都会将 设为_返回的值,但这不是必需的,因此只需按原样读取即可。