在Chicken计划中将列表转换为循环列表?

时间:2013-10-16 21:23:43

标签: scheme circular-list chicken-scheme

在试图找到如何转换这样的列表时,我遇到了 Scheme streams and circular lists。但是,该答案要求Racket中的功能在Chicken计划中不可用。任何人都能指出我在鸡计划中如何做到这一点的方向吗?还是以方案变体中立的方式?

2 个答案:

答案 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)