在试图找到如何转换这样的列表时,我遇到了 Scheme streams and circular lists。但是,该答案要求Racket中的功能在Chicken计划中不可用。任何人都能指出我在鸡计划中如何做到这一点的方向吗?还是以方案变体中立的方式?
答案 0 :(得分:3)
如果您可以改变列表,这是一种标准方式:
(define (make-circular lst)
; helper for finding the last pair in a list
(define (last-pair lst)
(if (null? (cdr lst))
lst
(last-pair (cdr lst))))
; special case: if the list is empty
(cond ((null? lst) '())
(else
; set the last pair to point to the head of the list
(set-cdr! (last-pair lst) lst)
lst)))
请注意,以上内容将修改输入列表。除此之外,它按预期工作:
(make-circular '(1 2 3 4 5))
=> #0=(1 2 3 4 5 . #0#)
(car (cdr (cdr (cdr (cdr (cdr (make-circular '(1 2 3 4 5))))))))
=> 1
答案 1 :(得分:2)
使用SRFI时非常简单:
(使用srfi-1) (定义l'(1 2 3 4)) (应用循环清单l)