破壊すると、そこへの道のりの一部が得られます。
(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
これは修正できますが、マクロはより複雑にする必要があります