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

欢迎!有关更多信息,请参阅 关于 页面。

0
Clojure

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

(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
by

评论由:alexmiller

在这个补丁中有很多与问题无关的空白更改 - 你可以提供只包含问题更改的更小的补丁吗?还需要测试。

0
by

评论由:kworam

我将提供不带空白更改的补丁文件。

我知道在 test_clojure\sequences.clj 和 test_clojure\transducers.clj 中存在一些用于'partition'和'partition-all'的现有功能测试。我认为我不需要增加更多的功能测试,但我认为应该增加以下测试:

  1. 验证非正的'step'和'n'参数被拒绝的测试。
  2. 展示'partition'和'partition-all'性能没有显著下降的测试。

你能给我一些关于如何开发和添加这些测试的指导吗?

0
by

评论由:alexmiller

你应该在第1个补丁中添加#1。对于#2,你可以在(criterium是一个很好的工具)前后做计时,并把结果放在描述中。

0
by
komentarz dokonczył: kworam_

我已经编写了#1的测试,并使用criterium记录了一些'before'计时。

我已经被一个问题困扰了好几个小时,现在我需要一些帮助。我对'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。  

任何帮助都将受惠匪浅。


user=> (source partition)
(defn partition
  "返回n个元素的列表的懒序列,偏移量为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
user=> (partition -1 [1 2 3])
()
user=> (source partition-all)
(defn partition-all
  "返回类似partition的惰性序列列表,但可能包括
  末尾包含少于n个项的分区。如果没有提供集合,则返回状态可变的
  transducer。"}
  {: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
user=> (partition-all -1 [1 2 3])
AssertionError AssertionError:(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的改变却没有。然而,如果我将(function source partition)的调用结果复制并执行(用(user partition)替换clojure.core/partition),user/partition则按预期工作。我不理解为什么clojure.core/partition的改变对我的代码没有影响。

0

评论者:jafingerhut

Kevin,我不知道你的Clojure源代码树的历史,但如果你曾经在这里运行过'ant',那会在根目录中创建jar文件,而'mvn package'则会在target目录中创建它们。从你上面的更长评论中并不清楚你运行的'java -cp ...'命令指向的是哪个(target目录中的)。这可能不是你看到的问题的原因,但我还没有其他猜测。

0

评论由:alexmiller

这个状态如何?

0

评论由:kworam

Alex,我最近搬到西雅图,并在微软找到了一份正式工作。这让我非常忙碌,我根本没有时间为Clojure腾出时间。我可能还需要一个月或两个月才能腾出时间来处理Clojure。

0

评论由:alexmiller

谢谢你提醒。

0

评论者:alex+import

Kevin,Alex,如果你愿意的话,我可以接手这个任务吗?

...