list - 方案流和循环列表

标签 list functional-programming lisp scheme 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))))

非常感谢所有帮助。

最佳答案

不,您不需要流来制作循环列表。

创建循环列表有两种方法,标准 Scheme 方法和 Racket 方法(因为 Racket 的 conses 是不可变的)。我将使用 SRFI 1 查看示例的 circular-list 功能。这是引用实现:

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

它的作用是找到给定值列表中的最后一对,然后 set-cdr! 将其返回到该列表的开头。非常简单,对吧?

在Racket中,conses是不可变的,所以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)))

这使用了 Racket 的 make-reader-graph函数来处理循环。非常漂亮。 :-)

关于list - 方案流和循环列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14678943/

相关文章:

Java:将 List<String> 转换为 join()d 字符串

python - 'pythonic' 与函数式编程中的 'fold' 函数等效是什么?

scala - 如何使用遍历TypeClass根据元素累加状态,然后映射到状态和元素之上?

recursion - 拆分列表的 Lisp 递归

scheme - 有人可以解释 : (+2 (if (>b a) b a))?

lisp - Lisp 中的函数

python - Pandas - 拆分一行值并与多行合并

list - 在 play 框架中访问 List[String] 时出错

python:从 python 字符串列表中提取 float (AUD 31.99)

functional-programming - Monad 组合(续·状态)