我有一个Clojure功能:
(def obseq
(fn []
(let [a 0
b 1
c 2]
(println (seq '(a b c))))))
输出:
(a b c)
我希望它输出一个包含a,b和c值的序列,而不是它们的名称。
期望的输出:
(1 2 3)
我该如何实现?
答案 0 :(得分:5)
clj.core=> (defn obseq []
(let [a 0
b 1
c 2]
(println [a b c])))
#'clj.core/obseq
clj.core=> (obseq)
[0 1 2]
nil
引用'(a b c)
等表单递归阻止 引用表单内的任何评估。因此,3个符号a
,b
和c
的值不会被替换。使用矢量(方括号)要容易得多,它永远不需要引用(与列表不同)。由于向量是不加引号的,因此评估3个符号并用它们的值替换。
如果您希望它出于某种原因保留列表,最简单的方法是键入:
clj.core=> (defn obseq [] (let [a 0 b 1 c 2] (println (list a b c))))
#'clj.core/obseq
clj.core=> (obseq)
(0 1 2)
nil
此版本也没有引用,因此3个符号将替换为其值。然后函数(list ...)
将它们放入列表数据结构中。
请注意,我还将您的(def obseq (fn [] ...))
转换为首选格式(defn obseq [] ...)
,其结果相同但更短且(通常)更清晰。