`:as` 绑定是否仅在函数参数是临时参数时才有用?

Is the `:as` binding useful only when the argument to a function is a temporary?

Clojure Programming:as的第一个用法如下

(let [[x _ z :as original-vector] v]
  (conj original-vector (+ x z)))
;= [42 foo 99.2 [5 12] 141.2]

然而,通过在 https://rextester.com/l/clojure_online_compiler 上做一些实验,我发现 vlet 的主体中可见,所以我可以跳过 :as 解构并使用 v 而不是 original-vector,结果是相同的

(let [[x _ z] v]
  (conj v (+ x z)))
;= [42 foo 99.2 [5 12] 141.2]

如果我有一个更复杂的表达式而不是 v,这显然是不可行的(在 C++ 中我会说 temporary/rvalue ,而 v 将是一个 左值 )。

所以我的问题是::as 语法是否仅在我们解构临时对象时有用,而在我们解构命名实体时它完全多余?我的意思是在上面的示例中,使用 :as 的唯一区别似乎是我们通过另一个名称引用 v,但我看不出这有什么好处......


示例假设

(def v [42 "foo" 99.2 [5 12]])

你说得对,:as 解构技术可能是多余的。但是,解构形式的 :as 几乎总是与函数的参数向量一起使用,而不是与 let 形式一起使用:

(ns tst.demo.core
  (:use tupelo.core tupelo.test))

(defn myfun
  [[x _ z :as original-vector]]
  (conj original-vector (+ x z)))

(dotest
  (is= [1 2 3 4]
    (myfun [1 2 3])))

然而,值得注意的是,解构的全部力量 可用于函数参数和 let 形式。


示例是使用 my favorite template project 构建的。