如何访问 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)
(懒惰不用在意)
我正在玩 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)
(懒惰不用在意)