我试图打印出一个符号列表,我想知道我是否 可以删除引号。
(def process-print-list
(fn [a-list]
(cond (empty? a-list) 'false
(list? a-list) (let [a a-list] (println (first a)) (process-print-
list (rest a) ))
:else (process-print-list (rest a-list) ))))
列表是('x'y'z))
使用以下输出:
(quote x)
(quote y)
(quote z)
我只是想把它打印出来:
x
y
z
答案 0 :(得分:7)
('x 'y 'z)
是((quote x) (quote y) (quote z))
的句法缩写。如果你真的想要一个符号列表(即(x y z)
),你可能在某个地方引用太多。
'(x y z) ;=> (x y z)
'('x 'y 'z) ;=> ((quote x) (quote y) (quote z))
(list 'x 'y 'z) ;=> (x y z)
通常,除非您知道自己在做什么,否则不要使用引号构建列表。改为使用list
构造函数。
另一方面,我会在这里选择迭代而不是递归。这很好用:
(doseq [sym some-list]
(println sym))
答案 1 :(得分:2)
您应该使用name
fn来获取符号名称。
(def my-list (list 'x 'y 'z))
(defn process-list
[a-list]
(map #(name %) a-list))
(process-list my-list)
;=> ("x" "y" "z")
或打印
(defn process-print-list
[a-list]
(doall (map #(println (name %)) a-list))
nil)
(process-print-list my-list)
;x
;y
;z
;=>nil
或者将它们组合起来获得你想要的返回类型......