2016-08-03 29 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}) 

做我才知道,這是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

感謝ü艾倫這樣一個很好的解釋。我接受了尤里的回答,他讓我介紹了讓我很開心的入門。 – sdream