直到现在,我一直认为你可以在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] ...
这件事不起作用(或不应该)有什么特别的原因吗?