为什么 line-seq 返回 clojure.lang.Cons 而不是 clojure.lang.LazySeq?

2024-01-06

根据 ClojureDocs 中 line-seq 的条目(http://clojuredocs.org/clojure_core/clojure.core/line-seq http://clojuredocs.org/clojure_core/clojure.core/line-seq)以及堆栈问题的公认答案(在 Clojure 1.3 中,如何读写文件 https://stackoverflow.com/questions/7756909/in-clojure-1-3-how-to-read-and-write-a-file),当传递 java.io.BufferedReader 时,line-seq 应该返回一个惰性 seq。

然而,当我在 REPL 中测试它时,该类型被列为 clojure.lang.Cons。请参阅下面的代码:

=> (ns stack-question
     (:require [clojure.java.io :as io]))
nil
=> (type (line-seq (io/reader "test-file.txt")))
clojure.lang.Cons
=> (type (lazy-seq (line-seq (io/reader "test-file.txt"))))
clojure.lang.LazySeq

在lazy-seq调用中包装line-seq调用会给出一个lazy seq,但根据文档,这应该不是必需的:line-seq无论如何都应该返回一个lazy seq。

笔记: 在 REPL 内部(我正在使用 nrepl),似乎惰性 seq 得到了完全实现,所以我认为这可能只是 REPL 的一个怪癖;然而,当我用 Speclj 测试它时,也存在同样的问题。另外,我认为实现惰性序列与正在发生的事情无关。

编辑: 所以我在mobyte的回答说cons尾部有一个lazy seq后去检查源代码......

1   (defn line-seq
2     "Returns the lines of text from rdr as a lazy sequence of strings.
3     rdr must implement java.io.BufferedReader."
4     {:added "1.0"}
5     [^java.io.BufferedReader rdr]
6     (when-let [line (.readLine rdr)]
7       (cons line (lazy-seq (line-seq rdr)))))

对 cons 的调用可以解释为什么 line-seq 返回值的类型是 clojure.lang.Cons。


您不需要“换行”输出Cons因为它已经将惰性序列作为“尾部”:

(type (line-seq (io/reader "test-file.txt")))
=> clojure.lang.Cons

(type (rest (line-seq (io/reader "test-file.txt"))))
=> clojure.lang.LazySeq

(type (cons 'a (rest (line-seq (io/reader "test-file.txt")))))
=> clojure.lang.Cons

Edit.

注意:在 REPL 内部(我正在使用 nrepl),惰性 seq 似乎得到了 完全实现

不正确。你可以测试一下:

(with-open [r (io/reader "test-file.txt")] (line-seq r))
=> IOException Stream closed  java.io.BufferedReader.ensureOpen (BufferedReader.java:97)

这是因为line-seq回报lazy-seq尚未完全实现并且reader当 repl 尝试稍后实现结果以打印它时,它已经关闭。但如果你明确地意识到它会给出正常的结果,没有任何异常:

(with-open [r (io/reader "/home/mobyte/2")] (doall (line-seq r)))
=> ...  output ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 line-seq 返回 clojure.lang.Cons 而不是 clojure.lang.LazySeq? 的相关文章

  • 如何使用 clojurescript repl 评估宏

    一旦浏览器连接到 clojurescript repl 我以前就无法从 repl 调用宏 这个问题过去曾让我放弃使用 clojurescript 而更喜欢直接使用 javascript 基本上 我觉得 cljs repl 有点蹩脚 我又回到
  • 如何在 RHEL 6.1 / JDK7 上安装 Clojure 1.3 with contribs?

    我一直在努力让它发挥作用 获取 clojure 1 3 是一件轻而易举的事 但现在我一直在尝试安装 contrib 库 但遇到了错误 有关于如何正确执行此操作的指南吗 旧的 clojure contrib 整体库与 clojure 1 3
  • 如何替换被测模块的文件访问引用

    pyfakefs https code google com p pyfakefs 听起来非常有用 它 最初是作为核心 Python 模块的一个适度的假实现来开发的 以支持中等复杂的文件系统交互 并于 2006 年 9 月在 Google
  • Clojure实现多线程的最佳方法?

    我正在开发一个用 Clojure 编写的 MUD 客户端 现在 我需要两个不同的线程 一种接收用户的输入并将其发送到 MUD 通过简单的套接字 另一种读取 MUD 的输出并将其显示给用户 我应该只使用 Java 线程 还是应该使用一些特定于
  • 为什么这个 Clojure 程序在可变数组上运行如此慢?

    剧透警告 这是 代码降临 第六天的第一部分 我试图解决this http adventofcode com day 6Clojure 和 Scala 中的问题 Scala 程序在我的 Macbook Air 上运行良好 几秒钟内就完成了 然
  • Clojure 的分析工具?

    有谁知道 Clojure 有一个好的分析工具或库吗 我更喜欢可以从 REPL 中使用的东西 类似于 with profiling 过去是在 Allegro Common Lisp 中 有什么类似的事情吗 或者您是否有过与 Clojure 配
  • Clojure 尾递归与质因数

    我正在尝试自学 clojure 并使用 Prime Factors Kata 和 TDD 的原则来实现这一目标 通过一系列 Midje 测试 如下所示 fact primefactors 1 gt list fact primefactor
  • Perl 中的 Fork 无法在从文件读取的 while 循环内工作

    我正在运行一个 while 循环来读取文件中的每一行 然后使用该行的数据将进程分叉给子进程 N 行之后 我想等待子进程结束并继续接下来的 N 行 等等 它看起来像这样 while w
  • 如何在 repl 中加载新的 clojure 库

    所以我有这个工作流程问题 我很高兴在我的 clojure 项目 repl 上打字 并意识到我需要另一个不在我的库中的库project clj 在这种情况下 我需要tools cli图书馆 我打开project clj在我的编辑器中添加一个条
  • 为什么我在 Java 中收到 Unreachable Statement 错误?

    当我尝试编译时这个程序 http ideone com 7KfWn 我在第 21 行收到 无法访问的语句 错误 import java util import java io import java nio file import java
  • C# 中的日志文件锁定问题

    我有一个 Windows 服务 它将日志文件条目写入 XML 日志文件 我在服务运行时维护日志文件的句柄 并在服务停止时关闭 刷新和处置它 文件写入操作仅由服务执行 并且我在 FileAccess ReadWrite 中打开文件流 同时将共
  • 如何在 Clojure 中创建循环(且不可变)数据结构而不需要额外的间接?

    我需要在 Clojure 中表示有向图 我想将图中的每个节点表示为一个对象 可能是一条记录 其中包含一个名为 edges这是从当前节点直接可达的节点的集合 希望这是不言而喻的 但我希望这些图表是不可变的 我可以构造有向acyclic只要我进
  • VTK IO 的 C/C++ 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 C 模拟 它会生成大量数据 现在我正在使用 MATLAB 库将结果保存为 mat 文件 但最终
  • 在 Clojure 中处理两个序列中的值对

    我正在尝试加入 Clojure 社区 我经常使用 Python 我广泛使用的功能之一是 zip 方法 用于迭代值对 在 Clojure 中是否有一种 聪明且简短的 方法可以实现相同的目标 另一种方法是简单地将 map 与一些按顺序收集其参数
  • Clojure 中的宏和函数

    我在这个 Clojure 教程中读到了以下行 http java ociweb com mark clojure article html Macros http java ociweb com mark clojure article h
  • 调用 Clojure 高阶函数

    如果我定义一个返回如下函数的函数 defn add n n fn x x n 然后我可以将结果分配给一个符号 def add 1 add n 1 并称其为 add 1 41 gt 42 我如何调用结果 add n 1 而不将其分配给新符号
  • 使用 Fortran 90 正确读取输入文件中的注释行

    据我了解 Fortran 在从文件读取数据时 会跳过以星号 开头的行 假设它们是注释 好吧 我似乎在用我创建的一个非常简单的程序实现这种行为时遇到了问题 这是我的简单 Fortran 程序 1 program test 2 3 intege
  • 为什么多种方法不能用作试剂/重新构建的功能?

    在我正在构建的使用 Reagent 和 Re frame 的小型应用程序中 我使用多种方法来根据应用程序状态中的值分派应显示哪个页面 defmulti pages name defn main panel let current route
  • 我应该如何使 Clojure STM 程序持久化?

    我正在编写一个使用 STM 的 clojure 程序 目前 我在启动时从数据库填充 STM 使用引用 然后在 dosync 事务成功时异步更新数据库 我不知道我是否以正确的方式这样做 或者是否有更好的标准技术来做到这一点 谁能向我解释一下他
  • Common Lisp 中的原子和 Clojure 中的原子有什么区别?

    下列page http clojure org atoms讨论原子在 Clojure 中的工作原理 它并没有详细说明 Clojure 和其他 lisp 方言中原子之间的差异 Common Lisp 中的原子和 Clojure 中的原子之间的

随机推荐

  • 何时子类化而不是区分行为

    我很难决定何时应该子类化 而不是仅仅添加代表类的不同模式的实例变量 然后让类的方法根据所选模式起作用 例如 假设我有一个base car班级 在我的程序中 我将处理三种不同类型的汽车 赛车 busses and 家庭型号 每个人都有自己的齿
  • 将文本附加到文件末尾

    我使用下面的代码段在每次调用时将文本写入文件末尾 但是 它会擦除 旧数据 然后将新数据写入文件的开头 如何修复以下代码以便附加新数据always文件末尾 public boolean writeToFile String directory
  • Tweepy 搜索查询问题

    我正在开发一个使用 Twitter 的 REST API 分析数据的程序 我希望使用具有多个关键字的查询来获取我正在寻找的结果 但是 我在使用搜索查询获取特定结果时遇到问题 我已按照文档使用 OR 搜索多个单词 但它仅在一定程度上有效 在此
  • 在Shiny中获取用户IP

    有没有办法获取访问闪亮应用程序的人的IP 希望有一个 R Shiny 解决方案 但我也可以接受 javascript 解决方案 我想对 IP 进行反向地理编码 以制作图表来可视化大多数用户从哪些国家 地区访问该应用程序 然后将该信息放入应用
  • 在 UICollectionView/UITableView 中对滚动视图的偏移进行动画处理会导致单元格过早消失

    我们有一个 UICollectionView 其自定义布局与 UITableView 非常相似 它垂直滚动 UICollectionView 仅同时显 示 3 个单元格 其中之一是当前活动的单元格 1 2 3 此处的活动单元格为 2 单元格
  • 如何获取Lua哈希表中键的数量?

    myTable myTable foo 12 myTable bar blah print myTable this prints 0 我实际上是否必须迭代表中的项目才能获取键的数量 numItems 0 for k v in pairs
  • 如何向字符串添加度数符号?

    我正在用 Objective C 编写 如何向字符串添加度数符号 我知道它的unicode 00B0和 UTF8 C2 B0 使用字符串文字 u00B0 对于 Unicode 字符 它始终是 u 后跟字符代码 NSString temper
  • 无法与空值合并; neo4j 中“无法使用 null 属性值合并节点”

    我的 csv 中有一个列 如下所示 我正在使用此代码来测试日期分割的工作原理 LOAD CSV WITH HEADERS FROM file some csv csv AS line WITH SPLIT line date of birt
  • 关于循环排列

    我学过数学 然后我就想到了这个问题 有两个排列 A 和 B 以及一个整数 M 如果我们可以从 A 到 B 进行以下操作 我们就说 A 几乎等于 B 1 选择排列 A 的 M 长度段 2 对其进行向右循环移位 因此 如果子段是 1 2 3 4
  • 基于视图状态在 Page_PreRender 中创建动态控件会导致按钮 OnClick 事件不起作用

    我意识到应该在 Page Load 和 Page Init 中创建动态控件 以便将它们注册到控件树中 我创建了一个自定义控件 需要在按钮 OnClick 事件中使用 ViewState 然后使用此 ViewState 动态创建控件 由于生命
  • 两行代码的冲突使代码无法按照我的意思工作,我可以做些什么不同的事情来完成这项工作(?)

    尝试自己运行以下代码 您会注意到 can t 更改为 CAN t 但我希望它更改为 CAN NOT 另一方面 我想保留第一行代码 它将 can 更改为 CAN 我怎样才能实现这个 can CAN can t CAN NOT 您必须删除 从默
  • 复数如何捕获 FFT 结果中的相位、幅度和频率?

    据我了解 幅度和相位是在 fft 结果的实部和虚部中捕获的 但每个样本如何捕获相位呢 相位与时域中提供的 N 个离散样本相关吗 也就是说 如果输入样本一秒钟包含 44100 个样本 那么 FFT 的每个结果值是否代表相位的 1 44100
  • 如何在CSS中获得图像周围的白色轮廓

    我正在尝试设置周围有白色边框的图像样式 如下所示 如果我这样做 ul class learn li class thumbnaile img src assets allyson jpg class stretch li ul 然后向 th
  • 为什么我的 Matlab for 循环代码比我的矢量化版本更快

    我一直听说矢量化代码比 MATLAB 中的 for 循环运行得更快 然而 当我尝试向量化 MATLAB 代码时 它似乎运行得更慢 I used tic and toc来测量时间 我只更改了程序中单个函数的实现 我的矢量化版本运行了47 22
  • 添加 php 到 html 打印格式 %1$s, %2$s, %3$s

    我想添加自定义字段 h4 Some text h4 to html format div class div class cruises layout div class image wrapper 1 s 3 s 9 s div div
  • 直接从过程/函数获取 TAdvEdit.Text

    您好 我收到错误 E2197 DCC 错误 proj1 pas 34 E2197 常量对象无法作为 var 参数传递 unit proj1 interface uses Winapi Windows Winapi Messages Syst
  • CSS 未在 IE 10 中呈现

    CSS 文件不会在 IE 9 和 10 中呈现 但在兼容模式下运行良好 我在 IE 10 中收到以下错误 SEC7113 CSS由于 mime 类型不匹配而被忽略 其中我在响应标头中没有得到内容类型 此外 这是在我本地的 任何建议都可以 它
  • 如何查明 CloudKit 订阅何时被删除?

    我在我的 iOS 应用程序中使用 CloudKit 在我的应用程序中 每当用户修改某些数据时 我都会更新 CloudKit 私有数据库 以便用户的其他设备也可以更新 用户可以启用 禁用此同步机制 当用户启用同步时 我创建一个订阅并将本地数据
  • 在 javascript 中减少初始值

    我正在尝试将数组减少为其偶数值的总和 我一直在检查 MDN 的文档 https developer mozilla org en US docs Web JavaScript Reference Global Objects Array R
  • 为什么 line-seq 返回 clojure.lang.Cons 而不是 clojure.lang.LazySeq?

    根据 ClojureDocs 中 line seq 的条目 http clojuredocs org clojure core clojure core line seq http clojuredocs org clojure core