我正在玩wit/duckling库。它是用clojure编写的,我以前没有clojure的经验。通过遵循其文档,我得到一个变量的值
({: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 ,以冒号(:)开头的标记是关键字而不是键。我想访问:values 关键字的值,我也读过有关clojure基础知识但无法访问:values 关键字的值。我希望必须有一种方法,通过写 lazy_seq [:values] ,我得到它的价值。有人可以帮忙??
答案 0 :(得分:5)
试试这个:
> (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
(按此顺序)流动。< / p>
答案 1 :(得分:3)
假设您的序列由s
表示:
(get-in (first s) [:value :values])
如果序列中可能有多个相同形状的元素,并且您希望一次处理所有{@ 1}},那么
:values
(你不需要关心懒惰。)