Cod*_*lus 1 lisp scheme functional-programming list circular-list
在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))))
Run Code Online (Sandbox Code Playgroud)
非常感谢所有帮助。
不,您不需要流即可制作循环列表。
创建循环列表有两种方法,标准的Scheme方法和Racket方法(因为Racket的缺点是不变的)。我会看看使用的例子SRFI 1的circular-list功能。这是参考实现:
(define (circular-list val1 . vals)
(let ((ans (cons val1 vals)))
(set-cdr! (last-pair ans) ans)
ans))
Run Code Online (Sandbox Code Playgroud)
要做的是在给定值列表中找到最后一对,并将set-cdr!其返回到该列表的开头。很简单吧?
在球拍中,约束是不可变的,因此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)))
Run Code Online (Sandbox Code Playgroud)
这使用了球拍的make-reader-graph功能来处理循环。很漂亮 :-)