计划流和圆形名单(Scheme streams and circular lists)

2019-10-17 16:24发布

在计划/ 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))))

所有帮助是极大的赞赏。

Answer 1:

不,你不需要流,使循环列表。

有两种方法可以创建循环列表,标准的计划方法,而球拍的办法(因为球拍的Conses很不变)。 我会看看使用的例子SRFI 1的circular-list功能。 这里的参考实现:

(define (circular-list val1 . vals)
  (let ((ans (cons val1 vals)))
    (set-cdr! (last-pair ans) ans)
    ans))

什么,做是要找到在给定的值列表中的最后一对,并set-cdr! 寄回到列表的开头。 很简单,对不对?

球拍,Conses很不变的,所以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函数来处理周期。 很漂亮的。 :-)



文章来源: Scheme streams and circular lists