解构将使您成为其中的一部分:
(let [[a b c d e f :as env-name] [1 2 3 4 5 6]]
(apply do-something (take 4 env-name))
(apply f env-name)
(compute-another-thing a c))
请注意,使用 env-name 调用函数时必须使用apply 。
对于更优雅的东西(比如你提出的形式),我认为你必须编写自己的宏。
更新:这是一个可以处理简单情况的(非常简单的测试)宏:
(defmacro let-as
[as-bind-name bindings & body]
(let [lhs-bindings (map first (partition 2 bindings))]
`(let ~bindings
(let [~as-bind-name [~@lhs-bindings]]
~@body))))
只要您的普通 let 绑定的左侧是简单符号(即不使用解构),这应该可以满足您的要求。
一些 REPL 交互来说明:
core> (let-as env-name [a 1 b 2 c 3 d 4 e 5 f 6] (print env-name) (apply + env-name))
[1 2 3 4 5 6]
21
一些解构是表现良好的:
core> (let-as env-name [[a b] [1 2] [c d] [3 4]] (print env-name) (map first env-name))
[[1 2] [3 4]]
(1 3)
其他解构不是:
core> (let-as env-name [{:keys [a b]} {:a 1 :b 2}] (print env-name) (+ a b))
[{:keys [1 2]}]
3
这可以补救,但宏必须更复杂