Ada*_*old 1 clojure destructuring
考虑这种形式:
(def v [42 "foo" 99.2 [5 12]])
Run Code Online (Sandbox Code Playgroud)
我已经读过如果我必须在let
表单中声明一些未使用的变量,我应该用_
这种解构形式表示它们:
(let [[x _ _ [y z]] v]
(+ x y z))
Run Code Online (Sandbox Code Playgroud)
我的问题是如何进行分配_
?由于这不会引发异常,我认为第二个_
会覆盖第一个,但我不确定.那怎么做呢?
这种使用_
纯粹是传统的:从Clojure的角度来看,它只是一个常规符号,可用于命名本地.因此,您只需直接检查价值_
即可确认您的理解:
(let [[x _ _ [y z]] v]
_)
;= 99.2
Run Code Online (Sandbox Code Playgroud)
至于幕后发生的事情,最简单的检查方法是宏扩展let
表单:
(macroexpand-1 '(let [[x _ _ [y z]] v] _))
Run Code Online (Sandbox Code Playgroud)
为清晰起见,上面的结果重新格式化如下:
(let* [vec__7 v
x (clojure.core/nth vec__7 0 nil)
_ (clojure.core/nth vec__7 1 nil)
_ (clojure.core/nth vec__7 2 nil)
vec__8 (clojure.core/nth vec__7 3 nil)
y (clojure.core/nth vec__8 0 nil)
z (clojure.core/nth vec__8 1 nil)]
_)
Run Code Online (Sandbox Code Playgroud)
所以第二个_
只是影响第一个.
let*
是背后的实施细节let
; 它是编译器直接理解的特殊形式,let
宏添加了解构支持.
归档时间: |
|
查看次数: |
100 次 |
最近记录: |