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

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

0
Clojure

如果你向 partition 传递一个非正的 'n' 或 'step' 值,将得到一个无限循环。以下是一些示例

(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'在从初始函数调用到所有递归自调用过程中保持不变,我只需在一次初始调用中验证它们是正的。

因此,我创建了具有与当前版本'partition'和'partition-all'相同的实现的函数'internal-partition'和'internal-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获取了一些#2的'之前'时间。  

我已经被困在这项工作上数小时,我需要一些帮助。我在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'更改不是。据我所知,它们都应该抛出一个断言错误,错误输入参数是我提供的。  

任何帮助都将非常感激。


user=> (source partition)
(defn 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]
     (internal-partition n step pad coll)))
     (internal-partition n step coll))
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))
  ([n coll]
     (partition-all n n coll))
     (internal-partition-all n step coll)))
     {:pre [(pos? n)]}
user=> (partition-all -1 [1 2 3])
     {:pre [(pos? n) (pos? step)]}
     (internal-partition n step coll))
AssertionError AssertionError: n应该为正数  clojure.core/partition-all (core.clj:6993)
user=> (partition -1 [1 2 3])

你曾执行过mvn clean吗?或者rm target?


0

评论者:alexmiller

是的,我已经执行了mvn clean,并且在进行交互式测试之前,我已检查clojure-1.7.0-master-SNAPSHOT.jar的日期时间戳是否符合预期。我还甚至在我的Macbook上重新追踪了我的步骤,基于这样的理论:可能存在Windows特定的构建问题。

0
我对partition-all的更改按预期工作,但我对partition的更改不起作用。

评论者:kworam

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

0
Comment made by: jafingerhut

Kevin,我不了解你的Clojure源代码存储库的历史,但是如果你在其中运行过'ant',那么它会在根目录中创建jar文件,而'mvn package'则在target目录中创建它们。

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

0

评论者:alexmiller

这个状态如何?

0

评论者:kworam

Alex,我最近搬到西雅图,并加入微软担任永久职位。这让我非常忙,完全没有时间投入Clojure。我可能一个月或两个月内无法安排时间用于Clojure。

0

评论者:alexmiller

谢谢你提前告知。

0

评论人:alex+import

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

...