为什么你不能rseq一个RSeq?

Ben*_*itz 8 reverse clojure sequence rationale

user=> (rseq [:a :b])
(:b :a)
user=> (rseq (rseq [:a :b]))
ClassCastException clojure.lang.APersistentVector$RSeq cannot be cast to
  clojure.lang.Reversible  clojure.core/rseq (core.clj:1532)
Run Code Online (Sandbox Code Playgroud)

为什么不能rseq接受之前通话的结果rseq

我在docstring中读到参数必须是(实际上,"可以是")一个向量或有序映射,而上面显示它不能是一个RSeq,所以我已经知道了.我想知道的是:有这个限制的充分理由吗?这只是一种疏忽,还是这种限制提供了一些重要的好处?

此外,除了从不调用之外,还有一个方便的解决方法rseq吗?很难知道,当你RSeq从一个函数返回一个函数时,其他某个函数是否会调用rseq它.

我问,因为它是令人沮丧的看到我的代码抛出异常这样令人惊讶的原因小号.如果我知道为什么这是有道理的,我可能不太可能犯这种和类似的错误.

Joo*_*aat 4

您无法调用rseqseq,因为您需要一个具有恒定时间随机访问的输入集合来实现 fullfillrseq的恒定时间性能特征,而 seq 只提供从头向下的有效访问(迭代)。

调用rseq的结果rseq不能通过特殊情况返回原始集合,因为原始集合从来都不是 seq。如果调用rseqRSeq 会返回某些内容(seq coll),那么支持就不那么简单了(rseq (drop x (rseq coll)))。可能正是这些复杂性使得语言实现者根本无法支持“递归”rseq。

如果需要通用的反转功能,使用reverse- 会比较慢。如果可以的话,您可能只想保留对(seq coll)和 的引用(rseq coll)(如果您需要两者)。