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

欢迎!请参考关于 页面来了解此功能的一些更多信息。

0
Clojure

如果您将非正数 'n' 或 'step' 传递给 partition,您将获得一个无限循环。以下是一些示例

(partition 0 [1 2 3])
(partition 1 -1 [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。 

任何帮助都将非常感激。


用户=> (source partition)
(定义一个 partition
  "返回一个由 n 个元素组成的懒惰序列列表,间隔 step
  偏移。如果没有提供 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
用户> (partition -1 [1 2 3])
()
用户> (source partition-all)
(defn partition-all
  "像 partition 一样的懒惰序列列表返回,但可能包括
  结尾可能少于 n 个元素的分区。当没有提供收集时,返回一个状态可变的
  转换器。"
  {: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
用户> (partition-all -1 [1 2 3])
断言错误Assert失败: (pos? n)  clojure.core/partition-all (core.clj:6993)


0

评论者:alexmiller

你运行过 mvn clean?还是 rm target?

0

评论者:kworam

是的,我运行了 mvn clean 并在执行交互式测试之前检查了 clojure-1.7.0-master-SNAPSHOT.jar 的预期日期和时间戳。我还对我的 MacBook 做了回溯,因为可能存在 Windows 特定的构建问题。

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

0

评论者:jafingerhut

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

0

评论者:alexmiller

这个状态如何?

0

评论者:kworam

Alex,我最近搬到了西雅图,并在微软找到了一个长期职位。这让我非常忙碌,我几乎没有时间和Clojure度过。我可能还需要一个月到两个月的时间才能再次专注于Clojure。

0

评论者:alexmiller

谢谢你的提醒。

0

评论者:alexisimport

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

...