これまで、letバインディングでできることはすべて、フォームの引数ベクトル内でできると思っていましたdefn。
ただし、これに気付きました-letバインディングでこれを行うと、機能します:
(let [[x & more :as full-list] (range 10)]
(println "x:" x)
(println "more:" more)
(println "full list:" full-list))
; x: 0
; more: (1 2 3 4 5 6 7 8 9)
; full list: (0 1 2 3 4 5 6 7 8 9)
しかし、それを関数に取り込もうとすると、例外が発生します。
(defn foo [x & more :as full-list]
(println "x:" x)
(println "more:" more)
(println "full list:" full-list))
; CompilerException java.lang.RuntimeException: Unexpected parameter, compiling:(/tmp/form-init615613631940782255.clj:1:1)
注目すべきは、これが機能することです:
(defn foo [[x & more :as full-list]]
(println "x:" x)
(println "more:" more)
(println "full list:" full-list))
しかし、引数をコレクションとして渡す必要があります(foo [1 2 3])。
let内部でバインディングを特に使用せずに、可変数の引数を取る関数を定義し、引数のグループ全体をローカル変数にバインドすることは可能ですか? これが(defn foo [x & more :as full-list] ...機能しない (または機能しない) 特定の理由はありますか?