2016-08-03 12 views
1

Я играю с wit/duckling библиотекой. Это было написано в clojure, и у меня нет предыдущего опыта в clojure. Следуя своей документации я получил значение переменной, какКак получить доступ к значениям LazySeq

({:dim :time, :body "20 minutes from now", :value {:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second, :values ({:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second})}, :start 21, :end 40}) 

После выполнения некоторых поиска Google я пришел, чтобы узнать, что это clojure.lang.LazySeq и жетоны, начинающиеся с двоеточия (:) ключевые слова вместо из ключей. Я хочу получить доступ к значению : значения ключевое слово, я также читал об основах clojure, но не смог получить доступ к значению : значения ключевое слово. Я ожидаю, что должно быть так, что, написав lazy_seq [: values], я получаю его значение. Может кто-нибудь помочь?

ответ

2

Если предположить, что последовательность обозначается s:

(get-in (first s) [:value :values]) 

Если может быть несколько элементов одинаковой формы в последовательности, и вы хотите, чтобы обработать их все сразу становится все :values, то

(map #(get-in % [:value :values]) s) 

(Вам не нужно заботиться о лени.)

4

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

> (use 'clojure.pprint) 

> (def stuff '({:dim :time, :body "20 minutes from now", :value {:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second, :values ({:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second})}, :start 21, :end 40})) 

Мы используем функцию «довольно печатей» pprint получить красиво вложенный выход для структуры данных:

> (pprint stuff) 
({:dim :time, 
    :body "20 minutes from now", 
    :value 
    {:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second, 
    :values 
    ({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second})}, 
    :start 21, 
    :end 40}) 

Таким образом, мы имеем список из одного элемента , который представляет собой карту ключей: dim: body: value: start и: end. Значение для ключа :value - это еще одна карта ключей: type,: value,: grain,: values.

Таким образом, чтобы не-гнездо этого,

(pprint (first stuff)) 
{:dim :time, 
:body "20 minutes from now", 
:value 
{:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second, 
    :values 
    ({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second})}, 
:start 21, 
:end 40} 

> (pprint (:value (first stuff))) 
{:type "value", 
:value "2016-08-03T10:50:56.000+05:30", 
:grain :second, 
:values 
({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second})} 

> (pprint (:values (:value (first stuff)))) 
({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second}) 

Вы также можете использовать многопоточной первый макрос -> следующим образом:

> (pprint (-> stuff first :value :values)) 
({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second}) 

так, что первоначально вложенная структура stuffпотоки через функции first, :value и :values (в указанном порядке).

+0

поблагодарить у Алана за такое хорошее объяснение. Я принял ответ Юрия b/c, он заставил меня ввести прием, который мне очень помог. – sdream