Clojure 的一些持久性数据结构、向量、映射和集合具有瞬态类似物。对于向量,有pop!
和conj!
函数,类似于pop
和conj
对于持久向量,但没有peek!
。
是否有技术原因导致peek!
无法有效实施?还是在大多数用例中都不需要瞬态向量?我总能做到
(defn peek! [tvec] (get tvec (dec (count tvec))))
但是没有内置解决方案似乎很奇怪。
Clojure 的一些持久性数据结构、向量、映射和集合具有瞬态类似物。对于向量,有pop!
和conj!
函数,类似于pop
和conj
对于持久向量,但没有peek!
。
是否有技术原因导致peek!
无法有效实施?还是在大多数用例中都不需要瞬态向量?我总能做到
(defn peek! [tvec] (get tvec (dec (count tvec))))
但是没有内置解决方案似乎很奇怪。
这确实是一个最好针对 ggroup 的设计问题,但是 FWIW,我不久前确实进行了调查peek
,peek!
并且提供peek!
似乎是一个简单的问题,即创建一个新clojure.lang.ITransientStack
的并行接口clojure.lang.IPersistentStack
并让瞬态向量实现它。
我的猜测是,如果这样的接口尚不可用(并且由瞬态使用),则可能是优先级问题。java.util.Stack
Clojure中已经有一个单线程的快速堆栈实现,形式为 随着 Clojure-in-Clojure 取得进展,语法便利和向持久向量的平滑转换可能会出现。
(如果投入的努力回报很高,那么对 Clojure 的 Java 方面的改进是有意义的,即使最终目标是删除 Java 代码库的相关部分并用 Clojure 中的实现替换它。预期回报较低,等待协议被更普遍地使用等可能更有意义。当前可用的一组用于处理瞬态的函数足以满足 Clojure 自己的需求,我不确定peek!
ggroup 是否曾经有人呼吁过——至于#clojure,我记得有一次相关的对话——所以回报可能被认为很低……不过,你可以发起一场草根运动来改变这一点。:-))