如何访问LazySeq值

sdr*_*eam 3 clojure lazy-sequences

我正在玩机智/小鸭图书馆.它是用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})
Run Code Online (Sandbox Code Playgroud)

做了一些谷歌搜索后,我才知道,这是clojure.lang.LazySeq并开始用冒号记号(:)的关键字,而不是钥匙.我想访问value :values关键字的,我也读过关于clojure的基础知识,但是无法访问value :values关键字的.我希望必须有一种方法,通过写lazy_seq [:values],我得到它的价值.任何人都可以帮忙吗?

Ala*_*son 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}))
Run Code Online (Sandbox Code Playgroud)

我们使用"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})
Run Code Online (Sandbox Code Playgroud)

所以我们有一个项目列表,它是键的映射: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})
Run Code Online (Sandbox Code Playgroud)

您还可以使用线程优先宏->,如下所示:

> (pprint (-> stuff first :value :values))
({:type "value",
  :value "2016-08-03T10:50:56.000+05:30",
  :grain :second})
Run Code Online (Sandbox Code Playgroud)

使原来的嵌套结构stuff 过的功能first,:value:values(按该顺序).