如何访问LazySeq值

时间:2016-08-03 05:36:41

标签: clojure lazy-sequences

我正在玩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] ,我得到它的价值。有人可以帮忙??

2 个答案:

答案 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

(你不需要关心懒惰。)