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

欢迎!请参阅 关于 页面以了解如何工作的更多信息。

0
Clojure

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

(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进行了一些'before'的计时。

我已经被一个问题困扰了好几个小时,现在需要一些帮助。我在 core.clj 中对 'partition' 和 'partition-all' 进行了修改,然后执行 '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
  。如果没有提供 step,则默认为 n,即分区
  不重叠。如果提供了一个填充集合,则使用其元素作为
  必要的填充来完成最后一个分区,直至达到 n 项。如果
  填充元素不足,则返回一个少于 n 项的分区。"
  {:added "1.0"
  :static true}
  ([n coll]
  {:pre [(pos? n)]}
  {:pre [(pos? n) (pos? step)]}
  {:pre [(pos? n) (pos? step)]}
  ([n step coll]
  {:pre [(pos? n) (pos? step)]}
  {:pre [(pos? n) (pos? step)]}
  ([n step coll]
  ([n step pad coll]
nil
user=> (partition -1 [1 2 3])
()
user=> (source partition-all)
(defn partition-all
  "与 partition 类似,返回一个包含子列表序列的懒惰序列列表,但可能包含
  少于 n 项的分区。如果没有提供集合,则返回一个状态可转化的
  生成器。"
  {:added "1.2"
  :static true}
  ([^long n]
  (  internal-partition-all n))
  ([n coll]
  {:pre [(pos? n) (pos? step)]}
  {:pre [(pos? n) (pos? step)]}
  ([n step coll]
  {:pre [(pos? n) (pos? step)]}
nil
user=> (partition-all -1 [1 2 3])
AssertionError 断言失败:(pos? n)  clojure.core/partition-all (core.clj:6993)


0

评论由:alexmiller 添加

你是否执行了 mvn clean?或者删除了 target 目录?

0

评论由: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'会创建它们在target目录中。在你的上面的长评论中,并没有明确指出你运行的'java -cp ...'命令是指的是目标目录中的那个。这可能不是你所看到问题的原因,但到目前为止我还没有其他猜测。

0

评论由:alexmiller 添加

这个问题目前的状态是什么?

0

评论由:kworam 添加

Alex,我最近搬到了西雅图,并在微软找到了一份固定的工作。这使我非常忙碌,以至于我没有时间关注Clojure。我可能还有一个月或两个月无法抽出时间来。

0

评论由:alexmiller 添加

谢谢提醒。

0

评论者:alex+import

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

...