Clojure语言八:Sequence
来源:互联网 发布:mac上怎么下载office 编辑:程序博客网 时间:2024/05/05 00:40
sequence定义
sequence不是一般的list,实际上实现了ISeq接口,ISeq接口定义如下:
package clojure.lang;/** * A persistent, functional, sequence interface * <p/> * ISeqs are immutable values, i.e. neither first(), nor rest() changes * or invalidates the ISeq */public interface ISeq extends IPersistentCollection, Sequential{Object first();ISeq next();ISeq more();ISeq cons(Object o);}
sequence的操作
参考官方文档的说明:
The Seq interface(first coll)Returns the first item in the collection. Calls seq on its argument. If coll is nil, returns nil.(rest coll)Returns a sequence of the items after the first. Calls seq on its argument. If there are no more items, returns a logical sequence for which seq returns nil.(cons item seq)Returns a new seq where item is the first element and seq is the rest.下面的操作定义了一个sequence, 然后返回第一个元素。
user=> (first (map #(print-str %) [1 2 3]))"1"返回除了第一元素之外的其余元素组成的列表:
user=> (rest (map #(print-str %) [1 2 3]))("2" "3")注意,#(print-str %) 函数将元素转变成了字符串。
lazy sequence
只有当sequence真正被使用的时候,才会被真正填充元素。这叫做lazy sequence。前面的(map实际上返回的就是lazy sequence。只有当调用first的时候才获得包含真正数据的sequence。
script和REPL的区别
不过在REPL会话环境下,lazy sequence是无效的,因为REPL会强制填充sequence,并返回。只是为了方便你看到。
xml-seq
现在回到前面一篇使用的xml
http://blog.csdn.net/sheismylife/article/details/8444290
xml-seq可以返回lazy sequence
user=> (use 'clojure.xml)niluser=> (parse "/home/chenshu/a.xml"){:tag :service, :attrs nil, :content [{:tag :mongodb, :attrs nil, :content [{:tag :uri, :attrs nil, :content ["localhost"]}]} {:tag :socket, :attrs nil, :content [{:tag :port_number, :attrs nil, :content ["7777"]} {:tag :login_timeout, :attrs nil, :content ["200"]} {:tag :check_timeout, :attrs nil, :content ["200"]}]}]}user=> (xml-seq (parse "/home/chenshu/a.xml"))({:tag :service, :attrs nil, :content [{:tag :mongodb, :attrs nil, :content [{:tag :uri, :attrs nil, :content ["localhost"]}]} {:tag :socket, :attrs nil, :content [{:tag :port_number, :attrs nil, :content ["7777"]} {:tag :login_timeout, :attrs nil, :content ["200"]} {:tag :check_timeout, :attrs nil, :content ["200"]}]}]} {:tag :mongodb, :attrs nil, :content [{:tag :uri, :attrs nil, :content ["localhost"]}]} {:tag :uri, :attrs nil, :content ["localhost"]} "localhost" {:tag :socket, :attrs nil, :content [{:tag :port_number, :attrs nil, :content ["7777"]} {:tag :login_timeout, :attrs nil, :content ["200"]} {:tag :check_timeout, :attrs nil, :content ["200"]}]} {:tag :port_number, :attrs nil, :content ["7777"]} "7777" {:tag :login_timeout, :attrs nil, :content ["200"]} "200" {:tag :check_timeout, :attrs nil, :content ["200"]} "200")user=>格式化一下,再看:
( {:tag :service, :attrs nil, :content [{:tag :mongodb, :attrs nil, :content [{:tag :uri, :attrs nil, :content ["localhost"]}]} {:tag :socket, :attrs nil, :content [{:tag :port_number, :attrs nil, :content ["7777"]} {:tag :login_timeout, :attrs nil, :content ["200"]} {:tag :check_timeout, :attrs nil, :content ["200"]}]}] } {:tag :mongodb, :attrs nil, :content [{:tag :uri, :attrs nil, :content ["localhost"]}]} {:tag :uri, :attrs nil, :content ["localhost"]} "localhost" {:tag :socket, :attrs nil, :content [{:tag :port_number, :attrs nil, :content ["7777"]} {:tag :login_timeout, :attrs nil, :content ["200"]} {:tag :check_timeout, :attrs nil, :content ["200"]}]} {:tag :port_number, :attrs nil, :content ["7777"]} "7777" {:tag :login_timeout, :attrs nil, :content ["200"]} "200" {:tag :check_timeout, :attrs nil, :content ["200"]} "200" )可以看到xml-seq返回的结果第一部分就是parse返回的结果,之后就是每个xml元素单独一个list, 分别是mongodb, mongodb.uri, socket, socket.port_number, socket.login_timeout和socket.check_timeout.
- Clojure语言八:Sequence
- Clojure语言一:Symbol
- Clojure语言二:Literal
- Clojure语言三:容器
- Clojure语言五:StructMap
- Clojure语言十二: namespace
- 开始学习 Clojure 语言
- [转]Clojure 编程语言
- Clojure 语言的设计
- Clojure语言十六 clojure与java
- Clojure语言四:解析XML
- Clojure语言六:def & var
- Clojure语言七:I/O
- Clojure语言九:for循环
- Clojure语言十:fn object
- Clojure语言十一:map函数
- Clojure语言十四 常用宏
- Clojure语言十五 quote & unquote
- ABAP 三种内表的区别
- 咱终于有个家啦!!!!!
- CSS样式基础学习
- IplImage, CvMat, Mat 的关系
- Unitils单元测试示例
- Clojure语言八:Sequence
- Codeforces Round #117 (Div. 2)——B
- ios的一些知识点
- 从 Windows 移植到 UNIX,第 1 部分: 移植 C/C++ 源代码
- myeclipse tomcat启动,内存溢出问题
- 系出名门Android(1) - 在 Windows 下搭建 Android 开发环境,以及 Hello World 程序
- C/C++语言void及void指针深层探索
- 如何在GridView中进行删除操作时弹出提示问是否确认删除?
- IplImage, CvMat, Mat 的关系和相互转换(转)