2024Clojure状态调查 中分享您的想法!

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

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版本。  The (source ...)函数确实显示,我的'partition'和'partition-all'的源代码更改已经到位。  我的'partition-all'更改似乎 worked,但'my partition'更改没有work。就我所知,它们应该都使用提供的输入参数抛出AssertionError。  

任何帮助都将非常感激。


user=> (source partition)
(defn partition
  "返回n项列表的懒惰序列,列表间距为step。
  如果未提供step,则默认为n,即分区不重叠。
  如果提供了填充集合,则使用其元素作为所需填充完成最后一个分区至n项。
  如果填充元素不足,则返回包含少于n项的分区。
  {:added "1.0"}
  :静态 true}
  ([n coll]
     {:pre [(正数? n)]}
     (partition n n coll))
  ([n 步长 coll]
     {:pre [(正数? n) (正数? 步长)]}
     (internal-partition n 步长 coll))
  ([n 步长 填充 coll]
     (internal-partition n 步长 填充 coll)))
     (internal-partition n 步长 coll))
nil
用户=> (partition -1 [1 2 3])
用户=> (source partition-all)
()
(defn partition-all
  "返回像partition一样的懒惰序列列表,但可能包括末尾少于n项的分区。
  当未提供集合时,返回一个状态可传递的转换器。"
  {:added "1.2"}
  ([^长 n]
     (internal-partition-all n))
  ([n coll]
     (partition-all n n coll))
     (internal-partition-all n 步长 coll)))
     {:pre [(正数? n)]}
用户=> (partition-all -1 [1 2 3])
     {:pre [(正数? n) (正数? 步长)]}
     (internal-partition n 步长 coll))
断言错误:断言失败:(正数? n)  clojure.core/partition-all (core.clj:6993)
用户=> (partition -1 [1 2 3])

你运行了mvn clean吗?或者rm target?


0

评论者:alexmiller

是的,我运行了mvn clean并确定了clojure-1.7.0-master-SNAPSHOT.jar在执行交互式测试之前的期望日期时间戳。

0
我的partition-all更改按预期工作,但是partition的更改没有效果。

评论者:kworam

然而,如果我将(source partition)调用的结果复制并执行它(将clojure.core/partition替换为user/partition),则user/partition按预期工作。我不明白为什么我的clojure.core/partition的更改没有生效。

0
评论由:jafingerhut

凯文,我不知道Clojure源代码树的历史,但如果你在其中运行过'ant',那么它会在根目录中创建jar文件,而'mvn package'则会在target目录中创建它们。

从你上面更长的评论中不清楚你运行的'java -cp ...'命令是否指向target目录中的那个。这可能不是你遇到问题的原因,但我还没有其他猜测。

0

评论者:alexmiller

这个问题的状态如何?

0

评论者:kworam

Alex,我最近搬到西雅图,并在微软担任了永久职位。这让我非常忙碌,几乎没有时间投入到Clojure上。我可能还需要一个月或两个月才能再次将时间投入到Clojure上。

0

评论者:alexmiller

谢谢提醒。

0

评论者:alex+import

Kevin,Alex,如果你喜欢,我可以接手这个任务吗?

...