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

欢迎!请查看 关于 页面以了解更多信息。

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' 的当前版本相同。

我将 'step' 和 'n' 必须为正的先决条件添加到 'partition' 和 'partition-all' 函数中,并分别调用 '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 拍了一些 '之前' 的时间快照。

我已经被困在一个问题中几个小时了,我需要得到一些帮助。我将更改应用于 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,并用我提供的输入参数。 

任何帮助都将非常感谢。


用户=> (source partition)
(定义 partition
  "返回由 n 个项目的列表组成的懒序列,距离为 step
  相隔。如果未提供 step,默认为 n,即分区
  不重叠。如果提供了填充集合,则使用其元素来完成最后一个
  分区,直至达到 n 个项目。如果填充元素不足,则返回少于 n 个项目的
  分区。"
  {:added "1.0"
   :static true}
  ([n coll]
     {:pre [(正? n)]}
     (partition n n coll))
  ([n step coll]
     {:pre [(正? n) (正? step)]}
     (internal-partition n step coll))
  ([n step pad coll]
     {:pre [(正? n) (正? step)]}
     (internal-partition n step pad coll)))
nil
用户=> (partition -1 [1 2 3])
()
用户=> (source partition-all)
(定义 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 [(正? n) (正? step)]}
     (internal-partition-all n step coll)))
nil
用户=> (partition-all -1 [1 2 3])
断言错误 assertion-error 断言失败:"(正? 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 ...' 命令是指向目标目录中的那个。这可能不是你看到的问题的原因,但我还没有其他猜测。

0

评论者:alexmiller

这个状态如何?

0

评论者:kworam

Alex,我最近搬到西雅图,在微软担任了永久职位。这使我非常繁忙,几乎没有时间关注Clojure。我可能还要一个月或两个月才能抽出时间做Clojure。

0

评论者:alexmiller

谢谢提醒。

0

评论者:alex+import

Kevin,Alex,如果你们愿意,我可以接手这个工作吗?

...