最後の式が nrepl で永久に動かなくなったのはなぜですか (決して止まらないと思います)。停止するには Ctrl+c Ctrl+c が必要です。
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)
シーケンスには 100 未満の数字が 3 つしかありません。しかし、それは「無限」でfilter
あるため、4 番目の要素が存在しないことを判断するには、「無限」の数の要素を調べる必要があります。
サンプルiterate
コンストラクトは増加するシーケンスを生成するためtake-while
、結果を 100 未満の要素に制限する場合に使用できます。たとえば、次のようになります。
(take-while #(< % 100) (iterate #(+ % 17) 0))
上記の式の応答に示されているように、出力されたシーケンスは完全な結果ではありません (シーケンスの最後にある ... を確認してください) take
。 a ... シーケンス内にさらに多くのものがあることを示します。最後のケースでは、「100個未満の数字」では、nreplが印刷するために必要な最小数のアイテムが生成されないため、nreplはシーケンスからさらにアイテムを待ち続けます(これは反復の無限シーケンスです)