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)
我该如何实现?
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 [] ...),其结果相同但更短且(通常)更清晰.