dtype-next,libpython-clj,以及 tech.ml.dataset 都将范围赋予特殊含义,但它们通常需要对其进行解构才能这样做。对于 libpython,在某些情况下,我们创建了实际的 Python 范围。对于 dtype-next 及其相关产品,递增值为 1 的范围可能表示子缓冲区操作,而不是索引缓冲区操作;子缓冲区保持了 System/arraycopy 等操作的正确性,因此在某些情况下是主要的优化。
我希望能够从任何通过 clojure.core/range
创建的对象中获取起始点、步长和(如果存在)终止点。我可以通过反射,或者通过从通过范围生成的序列的第一和第二成员中减去以及计数来实现这一点,但我觉得能够直接查询此信息可能是一个安全且合理的变化。
这一切都可以通过简单地使 LongRange 和 Range 的开始、步长和结束成员对外公开来实现,因为这些成员已经是最终常量。
作为单独的讨论,可能值得考虑让有限范围像持久向量一样工作。我不想在一次讨论中混淆上述观点,但有时通过 nth 或 IFn 调用路径索引范围比使用 Clojure 的序列抽象更有效。对我来说,有限范围在本质上更像持久向量,而且它们可能精确地表现出与持久向量相同的行为,包括关于哈希码,从 java.util.RandomAccess
派生,并且 conj 在值合适地放入序列的情况下产生一个新的范围或持久向量。