Clojure rseq在恒定时间内?

Clojure rseq在恒定时间内?,clojure,Clojure,我在《实用Clojure》(第5章)中读到,rseq函数操作在恒定时间内执行。在我看来,这应该是一个线性时间运算。有人能帮我解释一下吗?我不知道它是如何实现的,但我认为它只是返回了一些实现序列接口的对象,并且知道如何以相反的顺序遍历结构(向量或排序映射)。结果序列是惰性的,因此它不必立即遍历整个结构 试试这个: (类[1234]) 您将看到: clojure.lang.PersistentVector 现在试试这个: (类(rseq[1234])) 并且序列实现是不同的: clojure.lan

我在《实用Clojure》(第5章)中读到,
rseq
函数操作在恒定时间内执行。在我看来,这应该是一个线性时间运算。有人能帮我解释一下吗?

我不知道它是如何实现的,但我认为它只是返回了一些实现序列接口的对象,并且知道如何以相反的顺序遍历结构(向量或排序映射)。结果序列是惰性的,因此它不必立即遍历整个结构

试试这个:

(类[1234])

您将看到:

clojure.lang.PersistentVector

现在试试这个:

(类(rseq[1234]))

并且序列实现是不同的:

clojure.lang.APersistentVector$RSeq

正如Roman所说,它是序列的一个更改接口。所有元素都在原来的位置,您只是以相反的顺序访问它们


您可以查看
RSeq
类来了解它是如何在这里实现的:

它以固定时间返回新接口,就像Goran Jovic所说的,但打印出来是线性的。因此,在REPL中显示它是线性的,但在def中显示它是恒定的。

非常感谢!这是有道理的。