Clojure - 对象序列

时间:2016-10-18 02:41:38

标签: variables clojure type-conversion sequence

我有一个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)

我该如何实现?

1 个答案:

答案 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个符号abc的值不会被替换。使用矢量(方括号)要容易得多,它永远不需要引用(与列表不同)。由于向量是不加引号的,因此评估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 [] ...),其结果相同但更短且(通常)更清晰。