【发布时间】:2014-10-12 20:18:48
【问题描述】:
直到现在,我一直认为您可以在 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] ... 让我感到很奇怪,这有什么特殊原因导致这不起作用(或不应该)吗?
【问题讨论】:
-
+1 我自己最近遇到了这个问题,对此感到非常沮丧
标签: clojure destructuring