2016-10-21 6 views
0

Я новичок в Clojure. У меня есть эти проблемы:Clojure прочитало содержание lazy-seq ({})

я получаю эти данные из функции:

({:lat 40.4167754, :lng -3.7037902, :address Madrid, Spain}) 

Когда я прошу класса, я получаю:

> class x 
> clojure.lang.LazySeq 

мне нужен доступ к : лат,: lng,: адрес, но я не знаю как.

+2

Если последовательность всегда содержит одно значение? Вы можете использовать '(first x)' для получения первой карты. – Lee

+0

Ваши данные не действительны. Я бы ожидал '({: lat 40.4167754,: lng -3.7037902,: address" Madrid, Spain "})', с предварительным '' ', если вы ожидаете его прочитать. – Thumbnail

+0

Спасибо @ Lee, что является ключом к решению моей проблемы. – matiasmasca

ответ

1

Попробуйте это:

(defn mystery-fn [] 
    (list {:lat 40.4167754, :lng -3.7037902, :address "Madrid, Spain"}) 
) 

(println :println (mystery-fn)) 
(prn  :prn  (mystery-fn)) 

(def a (first (mystery-fn))) 
(prn :a a) 

(def b (:lat a)) 
(prn :b b) 

с выходом:

:reloading (tst.clj.core) 
:println ({:lat 40.4167754, :lng -3.7037902, :address Madrid, Spain}) 
:prn ({:lat 40.4167754, :lng -3.7037902, :address "Madrid, Spain"}) 
:a {:lat 40.4167754, :lng -3.7037902, :address "Madrid, Spain"} 
:b 40.4167754 

Обратите внимание на разницу между println и prn. Используя prn, вы получаете строки с двойными кавычками, которые могут многое помочь, когда есть встроенные пространства.

Кроме того, если вы хотите наметить печатный результат, часто проще использовать ключевое слово как ярлык, например (prn :xyz ...), а не (println "xyz = " ...).

+0

Спасибо Алан, что работает. – matiasmasca