打印Clojure中符号列表

3
我试图打印符号列表,想知道是否可以去掉引号。
(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
2个回答

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))

2
您应该使用name函数来获取符号名称。
(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

或者结合它们以获得您想要的返回类型...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接