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
宏为其添加了解构支持。

我想你部分误解了我的问题。我对
没有问题,我只是不确定是否有阴影。我想你部分误解了我的问题。我对
没有问题
我只是不确定阴影。