不,您不需要流来制作循环列表。
有两种创建循环列表的方法,标准 Scheme 方法和 Racket 方法(因为 Racket 的 conses 是不可变的)。我将查看使用SRFI 1circular-list
函数的示例。这是参考实现:
(define (circular-list val1 . vals)
(let ((ans (cons val1 vals)))
(set-cdr! (last-pair ans) ans)
ans))
这样做是在给定值列表中找到最后一对,并将set-cdr!
其返回到该列表的开头。很简单,对吧?
在 Racket 中,conses 是不可变的,因此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
功能来处理循环。非常漂亮。:-)