直到现在,我一直认为你可以在 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] ...
。这个方法不起作用(或者不应该起作用)的原因是什么?