如何访问 LazySeq 值

How to access LazySeq values

我正在玩 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})

在做了一些 google 搜索后,我开始知道它是 clojure.lang.LazySeq 并且标记以冒号开头(:) 是关键字而不是键。我想访问 :values 关键字的值,我也阅读了 clojure 基础知识但无法访问 :values 关键字的值。我希望一定有一种方法可以通过编写 lazy_seq[:values],我得到它的值。有人可以帮忙吗??

试试这个:

> (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}))

我们使用 "pretty print" 函数 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(在那个顺序)。

假设您的序列表示为 s:

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

如果序列中可能有多个相同形状的元素,而你想一次处理所有的元素得到所有:values,那么

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

(懒惰不用在意)