распечатать список символов в ближайшем будущем - PullRequest
3 голосов
/ 16 декабря 2010

Я пытался распечатать список символов, и мне было интересно, если я может удалить кавычки.

(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 голосов
/ 16 декабря 2010

('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 голосов
/ 17 декабря 2010

Вы должны использовать 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

Или объедините их, чтобы получить желаемый тип возврата ...

...