いいえ、循環リストを作成するためにストリームは必要ありません。
循環リストを作成するには、標準の Scheme アプローチと Racket アプローチの 2 つのアプローチがあります (Racket の conses は不変であるため)。SRFI 1のcircular-list
機能を使った例を見ていきます。参照実装は次のとおりです。
(define (circular-list val1 . vals)
(let ((ans (cons val1 vals)))
(set-cdr! (last-pair ans) ans)
ans))
これは、指定された値のリストの最後のペアを見つけて、set-cdr!
そのリストの先頭に戻すことです。かなり簡単ですよね?
Racket では、cons は不変であるため、set-cdr!
存在しません。代わりに、Racket は次のようにします。
(define (circular-list val1 . vals)
(let ([ph (make-placeholder #f)])
(placeholder-set! ph
(cons val1 (let loop ([vals vals])
(if (null? vals)
ph
(cons (car vals) (loop (cdr vals)))))))
(make-reader-graph ph)))
これは Racket のmake-reader-graph
関数を使用してサイクルを処理します。とても気の利いた。:-)