0

在此处输入图像描述

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

4

3 回答 3

3

因为您正在尝试评估无限序列(通过将其打印到 REPL)。

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

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


看看*print-length*文档:

;; 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 ...)

您可能想要使用take-while而不是filter,因为您创建的序列iterate已经排序。

user=> (take-while #(< % 100) (iterate #(+ % 17) 0))
(0 17 34 51 68 85)
于 2013-04-10T07:11:43.473 回答
0

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

于 2013-04-10T07:09:24.477 回答
0

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

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

(take-while #(< % 100) (iterate #(+ % 17) 0))
于 2013-04-10T20:57:01.980 回答