Clojure 这种解构是如何让表单工作的?
考虑这种形式:Clojure 这种解构是如何让表单工作的?,clojure,destructuring,Clojure,Destructuring,考虑这种形式: (def v [42 "foo" 99.2 [5 12]]) 我已经读到,如果我必须在let表单中声明一些未使用的变量,我应该用表示它们 类似于此分解形式: (let [[x _ _ [y z]] v] (+ x y z)) 我的问题是的作业是如何进行的?因为这不会引发异常,所以我假设第二个\uu会覆盖第一个,但我不确定。那么这是如何工作的呢?这种使用\u的方式完全是传统的:从Clojure的观点来看,它只是一个可以用来命名本地名称的常规符号。因此,您只需直接检查的值即可
(def v [42 "foo" 99.2 [5 12]])
我已经读到,如果我必须在let
表单中声明一些未使用的变量,我应该用表示它们
类似于此分解形式:
(let [[x _ _ [y z]] v]
(+ x y z))
我的问题是的作业是如何进行的?因为这不会引发异常,所以我假设第二个\uu
会覆盖第一个,但我不确定。那么这是如何工作的呢?这种使用\u
的方式完全是传统的:从Clojure的观点来看,它只是一个可以用来命名本地名称的常规符号。因此,您只需直接检查的值即可确认您的理解:
(let [[x _ _ [y z]] v]
_)
;= 99.2
至于引擎盖下发生的事情,最简单的检查方法是宏扩展let
表单:
(macroexpand-1 '(let [[x _ _ [y z]] v] _))
为清晰起见,对上述结果进行了重新格式化,结果如下所示:
(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)]
_)
因此,第二个\uu
只是将第一个阴影遮住
let*
是let
背后的实现细节;它是一种编译器可以直接理解的特殊形式,let
宏为其添加了解构支持。这种使用\u
的方式纯粹是常规的:从Clojure的角度来看,它只是一个可以用来命名本地代码的常规符号。因此,您只需直接检查的值即可确认您的理解:
(let [[x _ _ [y z]] v]
_)
;= 99.2
至于引擎盖下发生的事情,最简单的检查方法是宏扩展let
表单:
(macroexpand-1 '(let [[x _ _ [y z]] v] _))
为清晰起见,对上述结果进行了重新格式化,结果如下所示:
(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)]
_)
因此,第二个\uu
只是将第一个阴影遮住
let*
是let
背后的实现细节;这是一种编译器可以直接理解的特殊形式,let
宏为其添加了解构支持。我想你部分误解了我的问题。我对
没有问题,我只是不确定是否有阴影。我想你部分误解了我的问题。我对没有问题
我只是不确定阴影。