Clojure 为什么过滤器卡在nrepl中?

Clojure 为什么过滤器卡在nrepl中?,clojure,nrepl,Clojure,Nrepl,为什么最后一个表达式在nrepl中永远停留(我想它永远不会停止)。 我必须按Ctrl+c Ctrl+c来停止它 如上面的表达式响应所示,打印的序列不是完整的结果(检查序列末尾的…),这表明nrepl在返回序列响应时,从序列中获取特定数量的项,并使用。。。表明序列中还有更多。在上一种情况下,“少于100个数字”不会产生nrepl需要打印的最小项目数,因此nrepl会继续等待序列中的更多项目(这是一个无限序列,因为需要迭代)如上面的表达式响应所示,打印的序列不是完整的结果(检查序列末尾的…),这表示

为什么最后一个表达式在nrepl中永远停留(我想它永远不会停止)。
我必须按Ctrl+c Ctrl+c来停止它

如上面的表达式响应所示,打印的序列不是完整的结果(检查序列末尾的…),这表明nrepl在返回序列响应
时,从序列中获取特定数量的项,并使用。。。表明序列中还有更多。在上一种情况下,“少于100个数字”不会产生nrepl需要打印的最小项目数,因此nrepl会继续等待序列中的更多项目(这是一个无限序列,因为需要迭代)

如上面的表达式响应所示,打印的序列不是完整的结果(检查序列末尾的…),这表示nrepl在返回序列响应时,从序列中获取特定数量的项,并用…打印,以指示序列中还有更多项。在上一种情况下,“少于100个”不会生成nrepl打印所需的最小项目数,因此nrepl会一直等待序列中的更多项目(这是一个无限序列,因为需要迭代)

,因为您正在尝试计算无限序列(通过将其打印到REPL)

例如,
(filter#(>%100)(iterate#(++%17)0))
的结果可以打印到REPL,因为REPL将打印结果序列的第一个
x
元素,然后是
,其中
x
是可以使用
(set!*print length*x)
设置的值

但是尝试计算
(filter#(<%100)(iterate#(++%17)0))
将永远运行,因为只有6个可能的元素


请查看文档:

;; Oops! Don't this!!!
user=> (iterate inc 0)
;; Frantically doing C-c C-c :-P
; Evaluation aborted.

user=> (set! *print-length* 10)
10

;; Now it's perfectly fine. Yay!
user=> (iterate inc 0)
(0 1 2 3 4 5 6 7 8 9 ...)

您可能希望使用而不是
过滤器
,因为您使用
迭代
创建的序列已经排序

user=> (take-while #(< % 100) (iterate #(+ % 17) 0))
(0 17 34 51 68 85)
user=>(花时间#(<%100)(迭代#(+%17)0))
(0 17 34 51 68 85)

因为您试图计算无限序列(通过将其打印到REPL)

例如,
(filter#(>%100)(iterate#(++%17)0))
的结果可以打印到REPL,因为REPL将打印结果序列的第一个
x
元素,然后是
,其中
x
是可以使用
(set!*print length*x)
设置的值

但是尝试计算
(filter#(<%100)(iterate#(++%17)0))
将永远运行,因为只有6个可能的元素


请查看文档:

;; Oops! Don't this!!!
user=> (iterate inc 0)
;; Frantically doing C-c C-c :-P
; Evaluation aborted.

user=> (set! *print-length* 10)
10

;; Now it's perfectly fine. Yay!
user=> (iterate inc 0)
(0 1 2 3 4 5 6 7 8 9 ...)

您可能希望使用而不是
过滤器
,因为您使用
迭代
创建的序列已经排序

user=> (take-while #(< % 100) (iterate #(+ % 17) 0))
(0 17 34 51 68 85)
user=>(花时间#(<%100)(迭代#(+%17)0))
(0 17 34 51 68 85)

序列中只有3个小于100的数字。但是,由于它是“无限”的,
过滤器必须查看“无限”数量的元素,以确定第四个元素不存在

由于示例
iterate
构造生成递增序列,如果要将结果限制为小于100的元素,可以使用
take while
。例如:

(take-while #(< % 100) (iterate #(+ % 17) 0))
(花时间#(<%100)(迭代#(+%17)0))

序列中只有3个小于100的数字。但是,由于它是“无限”的,
过滤器必须查看“无限”数量的元素,以确定第四个元素不存在

由于示例
iterate
构造生成递增序列,如果要将结果限制为小于100的元素,可以使用
take while
。例如:

(take-while #(< % 100) (iterate #(+ % 17) 0))
(花时间#(<%100)(迭代#(+%17)0))

我在问为什么有限结果不会被打印出来。仅仅因为它的长度小于打印长度?这很奇怪吗?这里没有有限序列,迭代是无限的,在无限序列上运行过滤器将导致无限序列。仅仅因为它的长度小于打印长度?REPL只是尝试获取第一个
x
元素。对于REPL,无法知道获取这些元素需要多少时间,或者是否可能。此外,您的序列不是有限的。因此,如果我要生成小于例如100但是5的倍数的数字,该怎么办?这是我的初始目标。@easterbunny您可以使用
take while
而不是filter.See我的更新。我在问为什么有限结果不会被打印出来。仅仅因为它的长度小于打印长度?这很奇怪吗?这里没有有限序列,迭代是无限的,在无限序列上运行过滤器将导致无限序列。仅仅因为它的长度小于打印长度?REPL只是尝试获取第一个
x元素。对于REPL,无法知道获取这些元素需要多少时间,或者是否可能。此外,您的序列不是有限的。因此,如果我要生成小于例如100但是5的倍数的数字,该怎么办?这是我的初始目标。@easterbunny您可以使用
take while
而不是filter、 查看我的更新。