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代わりにを使用することもできます。filteriterate

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

シーケンスには 100 未満の数字が 3 つしかありません。しかし、それは「無限」でfilterあるため、4 番目の要素が存在しないことを判断するには、「無限」の数の要素を調べる必要があります。

サンプルiterateコンストラクトは増加するシーケンスを生成するためtake-while、結果を 100 未満の要素に制限する場合に使用できます。たとえば、次のようになります。

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

上記の式の応答に示されているように、出力されたシーケンスは完全な結果ではありません (シーケンスの最後にある ... を確認してください) take。 a ... シーケンス内にさらに多くのものがあることを示します。最後のケースでは、「100個未満の数字」では、nreplが印刷するために必要な最小数のアイテムが生成されないため、nreplはシーケンスからさらにアイテムを待ち続けます(これは反復の無限シーケンスです)

于 2013-04-10T07:09:24.477 に答える