2013-02-04 39 views
1

在Scheme/Lisp中,我试图创建一个将列表转换为循环列表的函数。因此,我相信我需要构建一个无限流,其中列表的尾部指向列表的头部。计划流和循环列表

这是到目前为止我的代码:

(define (rotate-list l1 l1copy) 
    (if (null? (force (cdr l1))) 
     (cons (car l1) (delay l1copy))) 
     (cons (car l1) (delay (rotate-list (force (cdr l1)) l1copy)))) 

所有帮助是极大的赞赏。

回答

4

不,你不需要流创建一个循环列表。

创建圆形列表有两种方法,标准的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!寄回到列表的开头。很简单,对吧?

在球拍中,球杆是不可变的,所以set-cdr!不存在。因此,相反,球拍确实这样说:

(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))) 

这将使用球拍的make-reader-graph函数来处理周期。非常漂亮。 :-)