-1
user=> (defn make-list [] '(1 2 3))
#'user/make-list
user=> (defn get-list [] (map #(str "foo" % ) make-list))
#'user/get-list
user=> (get-list)
IllegalArgumentException Don't know how to create ISeq from: user$make-list  clojure.lang.RT.seqFrom (RT.java:505)
user=> (defn get-list [] (let [ml (make-list)] (map #(str "foo" % ) ml) ))
#'user/get-list
user=> (get-list)
("foo1" "foo2" "foo3")

为什么不能像从 LET 子句那样从函数的 BODY 以相同的方式访问 defn 中的值?

4

1 回答 1

3

defn声明一个函数,所以你需要调用它才能得到它的结果:

(defn make-list [] '(1 2 3))
(defn get-list [] (map #(str "foo" % ) (make-list)))
(get-list)

;; ("foo1" "foo2" "foo3")

但是由于您的makeList函数除了返回一个列表之外什么都不做,您可以使用def它来代替它,因为它只是声明了一个var

(def make-list '(1 2 3))
(defn get-list [] (map #(str "foo" % ) make-list))
(get-list)

;;("foo1" "foo2" "foo3")

最后,在 Clojure 中使用kebab-case而不是camelCase作为函数和 var 名称。这是约定,除非您声明协议或类型。

于 2014-06-02T01:13:36.980 回答