peek 不支持某些序列

问题描述

我在将 peek 函数与 seq 对象一起使用时遇到错误。这对我来说有点令人惊讶,因为我期望 peek 可以与任何 seq 对象一起使用。

(def r0 
  (re-seq #"\w+" "foo bar"))
(identity r0)
;; ("foo" "bar")

(peek r0)
; (err) Execution error (ClassCastException) at (REPL:1).

(peek '("foo" "bar"))
;; "foo"

(= r0 '("foo" "bar"))
;; true

(type r0)
;; clojure.lang.Cons

(type '("foo"))
;; clojure.lang.PersistentList

documentation of peek 表示 peek 接受一个集合对象。但是序列也是集合,对吧?但是 peek 不支持它。那么,这是一个文档错误吗?还是我错过了什么?

解决方法

根据 tomby42 8.2 年前在文档说明中的说法,

peek 与“实现 clojure.lang.IPersistentStack(如 clojure.lang.Persistent*)的持久类型”一起使用。

,

Clojure 在 Clojure 1.10.1 中函数 peek 的文档字符串(在撰写本文时为当前版本)是:“对于列表或队列,与第一个相同,对于向量,相同,但更多 比上一个更有效率。如果集合为空,则返回 nil。"

在有关 Clojurians Slack 的 peek 文档的一些讨论中,听起来可能 peek 的文档字符串中的“集合”一词指的是前面提到的列表、队列或向量的集合类型之一,而不是任意的 Clojure 集合。也就是说,它应该被解释为“集合”一词被替换为短语“列表、队列或向量”。