Clojure - 对象序列

0 variables clojure type-conversion sequence

我有一个Clojure功能:

(def obseq
  (fn []
    (let [a 0
          b 1
          c 2]
      (println (seq '(a b c))))))
Run Code Online (Sandbox Code Playgroud)

它输出:

(a b c)
Run Code Online (Sandbox Code Playgroud)

我希望它输出一个包含a,b和c值的序列,而不是它们的名字.

期望的输出:

(1 2 3)
Run Code Online (Sandbox Code Playgroud)

我该如何实现?

Ala*_*son 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
Run Code Online (Sandbox Code Playgroud)

答案很长:

引用'(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
Run Code Online (Sandbox Code Playgroud)

此版本也没有引用,因此3个符号将替换为其值.然后该函数(list ...)将它们放入列表数据结构中.

请注意,我还将您(def obseq (fn [] ...))转换为首选形式(defn obseq [] ...),其结果相同但更短且(通常)更清晰.