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'相同。

然后,我将'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. 测试以验证'partition'和'partition-all'会拒绝非正的'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。 

任何帮助都将非常感谢。


user=> (source partition)
(defn partition
  返回一个n个项目的列表的懒加载序列,列表之间相隔步进。如果没有提供步进,默认为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))
nil
[n step pad coll]
     (internal-partition n step pad coll)))
nil
nil
user=> (partition -1 [1 2 3])
user=> (source partition-all)
()
(defn partition-all
  "返回类似于partition的懒加载序列,但可能包含末尾项目少于n个的分区。
  当没有提供集合时,返回一个状态可变的转换器。{:
  added "1.2"
  [^long n]
     (internal-partition-all n))
     {:pre [(pos? n)]}
     (partition-all n n coll))
     (internal-partition-all n step coll)))
     (partition n n coll))
user=> (partition-all -1 [1 2 3])
     (internal-partition n step coll))
nil
(AssertionError Assert failed: (pos? n)  clojure.core/partition-all (core.clj:6993))
user=> (partition -1 [1 2 3])




0
您是否执行了mvn clean?或者rm target?

评论者:alexmiller

0

评论者:kworam

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

我将partition-all修改后的代码按预期运行,但我对partition的修改没有效果。然而,如果我将(source partition)函数调用结果复制并执行(将clojure.core/partition替换为user/partition),user/partition按预期运行。我不明白为什么clojure.core/partition的修改没有起作用。

0

评论者:jafingerhut

凯文,我不清楚你的Clojure源代码树的历史,但你如果在其中运行过'ant'命令,那么会在根目录中创建jar文件,而'mvn package'命令会在target目录中创建它们。从你上面的更长评论中无法明确看出你运行的'java -cp ...'命令指向的是哪个目录。这或许不是你遇到问题的原因,但我还没有其他任何猜测。

0

评论者:alexmiller

这个问题的状态是什么?

0

评论者:kworam

亚历克斯,我最近搬到西雅图并加入了微软的永久职位。这让我非常忙碌,我根本无法花时间在Clojure上。或许我一个月或两个月内都无法再投入到Clojure中。

0

评论者:alexmiller

谢谢你提醒。

0

评论人:alex+import

凯文,亚历克斯,如果你们喜欢,我可以接管这个项目吗?

...