请在 2024 年 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于 页面以获取更多有关此如何工作的小信息。

0
Clojure

如果您给 partition 传递非正的 'n' 或 'step' 值,您将得到一个无限循环。以下是一些例子:

(partition 0 (link: 1 2 3))
(partition 1 -1 (link: 1 2 3))

原因:partition 和 partition-all 并未检查 n 和 step 是否为正。

方法:在 partition 和 partition-all 中添加检查以确保 n 和 step 是正的。

补丁:clj-1647_3.patch

预审者:Alex Miller

29 个答案

0

由 alexmiller 添加的评论

也参见 CLJ-764

0

由 alexmiller 添加的评论

完成后需要性能审核。

0

kworam 添加的评论

用于修复 clj-1647 的补丁文件

0

kworam 添加的评论

由于'n'和'step'在所有递归自我调用过程中都保持不变,我只需要在初始调用时验证它们是否为正。

因此,我创建了函数'internal-partition'和'internal-partition-all',其实现与当前版本的'partition'和'partition-all'相同。

然后在'partition'和'partition-all'函数中添加了先决条件,'step'和'n'必须是正数,并使它们分别调用'internal-partition'和'internal-partition-all'来完成工作。

0

由 alexmiller 添加的评论

在这个补丁中有很多无关的空白更改 - 你能提供一个只包含问题的更改较小的补丁吗?还需要测试。

0

kworam 添加的评论

我将提供一个不带空白更改的补丁文件。

我知道在test_clojure\sequences.clj和test_clojure\transducers.clj中存在针对'partition'和'partition-all'的现有功能测试。我认为我不需要添加更多功能测试,但我想我应该添加

  1. 测试以验证非正的'step'和'n'参数被拒绝。
  2. 测试表明'partition'和'partition-all'的性能没有显著下降。

您能给我一些关于如何开发和添加这些测试的指导吗?

0

由 alexmiller 添加的评论

您应该在补丁中添加#1。对于#2,您可以在(criterium是一个很好的工具)做时间前后的计时,并将结果放入描述中。

0
_评论者:kworam_

我已编写了#1的测试,并使用criterium进行了一些'之前'的计时。

我已经遇到了一个难题好几个小时了,我需要一些帮助。我对 'partition' 和 'partition-all' 在 core.clj 文件中的内容进行了修改,然后通过执行 'mvn package' 命令来构建 jar 文件。 我还执行了 'target>java -cp clojure-1.7.0-master-SNAPSHOT.jar clojure.main' 来交互式测试我对 clojure 的修改版本。(source ...) 函数显示我的 'partition' 和 'partition-all' 的源代码更改已经到位。 我的 'partition-all' 的更改似乎正常工作,但 'partition' 的更改却不行。据我所知,它们都应该在提供的输入参数下抛出 AssertionError。  

任何帮助都将十分感激。


user=> (source partition)
(defn partition
  "返回一个由每个列表包含 n 个项的惰性序列,步长为 step
  。如果未提供步长,则默认为 n,即分区
  不会重叠。如果提供了填充集合,则使用其元素作为
  必要的填充到最后一个分区的 n 个项。如果没有
  足够的填充元素,返回一个包含少于 n 个项的分区。"
  {:added "1.0"
   :static true}
  ([n coll]
     {:pre [(pos? n)]}
     (partition n n coll))
  ([n step coll]
     {:pre [(pos? n) (pos? step)]}
     (internal-partition n step coll))
  ([n step pad coll]
     {:pre [(pos? n) (pos? step)]}
     (internal-partition n step pad coll)))
nil
user=> (partition -1 [1 2 3])
()
user=> (source partition-all)
(defn partition-all
  "返回一个类似于 partition 的惰性序列,但可能在末尾包含
  少于 n 个项的分区。如果没有提供集合,则返回一个状态
  可变的 transducer。"
  {:added "1.2"
   :static true}
  ([^long n]
     (internal-partition-all n))
  ([n coll]
     (partition-all n n coll))
  ([n step coll]
     {:pre [(pos? n) (pos? step)]}
     (internal-partition-all n step coll)))
nil
user=> (partition-all -1 [1 2 3])
AssertionError Assert failed: (pos? n)  clojure.core/partition-all (core.clj:6993)


0
by

由 alexmiller 添加的评论

你执行过 mvn clean 吗?或者 rm target?

0
by

kworam 添加的评论

是的,我执行过 mvn clean,并在进行交互式测试之前验证了 clojure-1.7.0-master-SNAPSHOT.jar 拥有预期的日期时间戳。我还试图在我Macbook上重复操作,以理论分析是否存在Windows特定的构建问题。

我的 partition-all 的更改按预期工作,但 partition 的更改却不行。然而,如果我将 (source partition) 的结果复制到,并执行它(用 user/partition 替换 clojure.core/partition),user/partition 按预期工作。我不知道为什么 clojure.core/partition 的更改不起作用。

0

评论人:jafingerhut

Kevin,我不知道你的Clojure源树的历史,但是如果你在其中运行过'ant',那么会在根目录中创建jar文件,而'mvn package'则会在目标目录中创建它们。从你上面的更长评论中,不清楚你运行的'java -cp ...'命令是否指向目标目录中的那个。这可能不是你所遇到问题的原因,但我还没有任何其他猜测。

0

由 alexmiller 添加的评论

这个问题的状态是什么?

0

kworam 添加的评论

Alex,我最近搬家去了西雅图,并在微软找到了一份固定职位。这让我非常忙,完全没时间做Clojure。我可能要再过一个月或两个才能分配时间给Clojure。

0

由 alexmiller 添加的评论

谢谢提醒。

0

评论人:alex+import

Kevin,Alex,如果你们愿意,我可以接管这个项目吗?

欢迎来到Clojure问答,您可以在这里提出问题,并获得Clojure社区成员的解答。

分类

...