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中,_它也被视为通配符.
看到:
下划线是通用忽略符号。
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 的每次评估都会将 设为_返回的值,但这不是必需的,因此只需按原样读取即可。