`
songry
  • 浏览: 84537 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Clojure-JVM上的函数式编程语言(5) Input/Output 作者: R. Mark Volkmann

阅读更多

 原帖地址:http://java.ociweb.com/mark/clojure/article.html#IO

 作者:R. Mark Volkmann

 译者:RoySong

 

Input/Output

    Clojure提供了针对I/O操作的最小限度函数集合。因为在Clojure代码可以轻松调用java代码,所以针对I/O操作

经常使用的是java.io包中的类。然而,在 Clojure Contrib 中的duck-streams库使得对java io类库的调用更简单。

 

    预定义的特殊符号*in* , *out*和 *err*默认提供了标准输入、输出和错误的功能。在 *out*中flush流输出可以采用

(flush),这等同于 (.flush *out*)。这些特殊符号的绑定是可以修改的。举个例子,将默认输出重定向为往文件“

my.log”中:

(binding [*out* (java.io.FileWriter. "my.log")]
  ...
  (println "This goes to the file my.log.")
  ...
  (flush))

 

    print函数可以输出以空格分隔的 任意数目 对象的字符串表现到 特殊符号*out*的流中。

 

    println函数类似print,不同点在于它会在每次输出的后面加上换行符。默认情况下,它会刷新输出。这个可以通过

指定特殊符号*flush-on-newline*为false来改变。

 

    newline函数会为*out*中的流添加上换行符,在print后面跟上 newline的执行结果等同于println。

 

    pr和 prn函数和print以及println很相似,不过它们的输出在一个form当中,这个form能够被Clojure reader读取。它们

适合序列化Clojure的数据结构。默认情况下,它们不会打印元数据。这个可以通过绑定特殊符号*print-meta*为true来改变。

 

    下面的例子展示了四种打印函数,注意在采用pr和print时打印字符串和字符的差异:

(let [obj1 "foo"
      obj2 {:letter \a :number (Math/PI)}] ; a map
  (println "Output from print:")
  (print obj1 obj2)

  (println "Output from println:")
  (println obj1 obj2)

  (println "Output from pr:")
  (pr obj1 obj2)

  (println "Output from prn:")
  (prn obj1 obj2))
 

    上面的代码输出如下:

Output from print:
foo {:letter a, :number 3.141592653589793}Output from println:
foo {:letter a, :number 3.141592653589793}
Output from pr:
"foo" {:letter \a, :number 3.141592653589793}Output from prn:
"foo" {:letter \a, :number 3.141592653589793}
 

    上面提到的所有函数都在输出的参数之间有个空格,采用str函数可以避免这个空格。它连接了所有输出参数的字符串

表现,例子如下:

(println "foo" 19) ; -> foo 19
(println (str "foo" 19)) ; -> foo19
 

    print-str , println-str , pr-strprn-str同 print , println , pr和 prn很相似,但是输出的目标从 *out*变成了一个字符串,这个字符串也做为它们的返回值。

 

    with-out-str宏捕获它内部所有表达式的输出并把这些输出放置在一个字符串中,然后将这个字符串做为返回值。

 

    with-open宏接受任意数量的对象绑定,在它内部的表达式执行完毕后会调用对象的 .close方法。这是为了处理需要

关闭的资源诸如文件或者数据库连接而设定的。

 

    line-seq函数接受一个 java.io.BufferedReader做为参数,并返回一个延迟序列,序列中包含了参数中读取到的所有

文本行。返回“延迟”序列的意义在于,在序列被调用时不会读取到所有的文本行, 这样就不会消耗太多内存。每次请求

延迟序列时,只会读取对应的一行。

 

    下面的例子展示了with-open 和line-seq的使用,它会读取某文件中的所有行,并输出包含某个特定字符的行。它采用了

两种方式,先是with-open,然后是 line-seq,它们都包含在 Clojure Contrib 的duck-streams库中。

(use '[clojure.contrib.duck-streams :only (read-lines)])

(defn print-if-contains [line word]
  (when (.contains line word) (println line)))

(let [file "story.txt"
      word "fur"]

  ; with-open will close the FileReader and BufferedReader
  ; after evaluating all the expressions in its body.
  (with-open [fr (java.io.FileReader. file)
              br (java.io.BufferedReader. fr)]
    (doseq [line (line-seq br)] (print-if-contains line word)))

  ; read-lines closes the Reader it creates
  ; after all the lines it returns in a lazy sequence are consumed.
  (doseq [line (read-lines file)] (print-if-contains line word)))
 

    slurp函数读取文件的整个文本并放置在返回结果的字符串中, duck-streams库提供了spit函数来将字符串写入到

文件中并关闭文件。

 

    这篇文章仅仅涉及到duck-streams库的表层而已,去阅读duck-streams.clj文件学习其中定义的函数是更好的选择。

分享到:
评论

相关推荐

    clojure-stuff

    学习: (俄语) (方案)文章 http://www.paradiso.cc/why-use-clojure/ http://www.reddit.com/r/Clojure/ 我使用 Clojure 的前六个月 - 2013.09 集成开发环境灯台开源,看起来很棒! ...

    函数式编程语言:Clojure.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    Clojure入门教程- Clojure – Functional Programming for the JVM中文版

    - **Clojure**作为一种功能强大且灵活的函数式编程语言,在JVM上运行具有独特的优势。它不仅支持高效的函数式编程,还具备出色的并发编程能力,使其成为开发高性能、高并发系统的理想选择。 - 对于希望深入了解函数...

    Android代码-clojure-jsr223

    Fork of http://code.google.com/p/clojure-jsr223/ that loads the Clojure runtime lazily. Copyright (c) 2009 Armando Blancas. All rights reserved. The use and distribution terms for this software are ...

    Clojure脚本:函数式编程的现代演绎

    Clojure是一种运行在Java虚拟机(JVM)上的动态函数式编程语言,它属于Lisp家族。Clojure的设计哲学强调了函数作为一等公民的地位,以及数据的不可变性,这些特性使得Clojure在处理并发编程和数据密集型应用时表现...

    Scala与Clojure函数式编程模式:Java虚拟机高效编程1

    Scala和Clojure都是现代函数式编程语言,它们都运行在Java虚拟机(JVM)上,能够利用Java的生态系统和资源。Scala是一种多范式语言,结合了面向对象和函数式编程的特点,提供了强大的类型系统和模式匹配功能。...

    clojure-utils, 各种小型但方便的clojure实用程序函数库.zip

    clojure-utils, 各种小型但方便的clojure实用程序函数库 各种小型但方便的Clojure实用程序函数库特别关注:Clojure.java - 用于从Java调用Clojure的实用工具函数的Java类arrays.clj - 操作Java数组core.clj - 应该在...

    来源clojure-toolbox.com___下载.zip

    1. **Clojure编程语言**:Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机(JVM)上。它强调 immutability(不可变性)、concurrency(并发性)和functional programming(函数式编程)特性。 2. **函数...

    clojure-1.5.1.jar

    clojure-1.5.1.jar

    clojure-sha-3-源码.rar

    Clojure是一种基于Lisp的现代函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java平台的强大功能。SHA-3,全称为Secure Hash Algorithm 3,是美国国家标准与技术研究所(NIST)发布的一种密码散列函数标准...

    Scala与Clojure函数式编程

    虽然Java本身不是一种函数式编程语言,但是JVM强大的生态系统为运行函数式编程语言提供了坚实的基础。 本书的作者Michael Bevilacqua-Linn通过自己的经验,结合了多个编程实践者的点评,将关于Scala和Clojure中函数...

    CS1807-U201814745-朱槐志函数式编程1

    Lisp是一种古老的函数式编程语言,其主要特点是使用S-表达式(Symbolic Expression)表示数据和程序。Lisp的数据结构核心是列表,而列表是通过递归定义的,这使得在Lisp中实现递归算法变得十分自然。它的宏系统允许...

    Clojure入门介绍: Clojure - Functional Programming for the JVM

    Clojure入门介绍: Clojure - Functional Programming for the JVM

    clojure-1.6.0-RC3.zip

    Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java生态系统的优势。这个压缩包很可能是Clojure 1.6.0-RC3的源代码发布,开发者可以下载、编译和测试以确保其稳定性和兼容性。 ...

    clojure-basics-源码.rar

    Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java的生态系统。这个“clojure-basics-源码.rar”压缩包很可能是包含了一些基本Clojure编程概念的示例代码或者教程。虽然没有具体...

    clojure-must-watch-源码.rar

    Clojure是一种功能强大的Lisp方言,它在Java虚拟机(JVM)上运行,并且具有丰富的函数式编程特性。这个压缩包"clojure-must-watch-源码.rar"似乎包含了与Clojure相关的源代码,可能是为了帮助学习者深入理解Clojure...

    clojure-1.5.0.zip

    该版本为稳定版,将zip文件解压,放到某个指定目录,cd进入这个目录,执行以下命令即可java -cp clojure-1.5.0.jar clojure.main。...当今最主流的运算平台JVM,把函数式编程语言引入JVM也是新方向。

    clojure1.3.0及资料

    Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java的生态系统。Clojure的设计目标是提供一种静态类型的、并发的、内存安全的语言,同时保持Lisp的简洁性和灵活性。在这个压缩包...

    clojure-basics:Clojure编程语言的语法基础

    clojure编程语言的语法基础。 如何安装 确保安装了bash,curl,rlwrap和java以下工具。 您可以通过运行以下命令来安装它们: sudo apt install curl rlwrap default-jdk 。 使用以下命令下载clojure安装脚本: ...

    Clojure的HTTP客户端包clj-http.zip

    \r\n \r\n \r\n \r\n \r\n \u8f6f\u4ef6\u9996\u9875\r\n \u8f6f\u4ef6\u4e0b\u8f7d\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\nwindow.changyan.api.config({\r\nappid:...

Global site tag (gtag.js) - Google Analytics