Functional programming 是否有可能在Scheme中创建一个没有变异的循环数据结构?

Functional programming 是否有可能在Scheme中创建一个没有变异的循环数据结构?,functional-programming,scheme,reference-counting,Functional Programming,Scheme,Reference Counting,我可以在Scheme中创建一个循环数据结构,如下所示: (define my-pair (cons 1 1)) (set-car! my-pair my-pair) 是否可以在Scheme中创建循环数据结构而不使用变异?(我正在准备一个关于参考计数极限的讲座。)通过一个相关问题()的链接,我看到了对letrec的参考。这让我意识到我确实可以在Scheme中创建一个循环的“数据结构”: (letrec ((add (lambda (x y) (if (>= x y) (+ x y) (ad

我可以在Scheme中创建一个循环数据结构,如下所示:

(define my-pair (cons 1 1))
(set-car! my-pair my-pair)

是否可以在Scheme中创建循环数据结构而不使用变异?(我正在准备一个关于参考计数极限的讲座。)

通过一个相关问题()的链接,我看到了对
letrec
的参考。这让我意识到我确实可以在Scheme中创建一个循环的“数据结构”:

(letrec ((add (lambda (x y) (if (>= x y) (+ x y) (add2 y x))))
         (add2 (lambda (x y) (if (>= x y) (+ x y) (add y x)))))
  (add 1 5))

您可以使用闭包创建惰性列表:

; The infinite list (1 1 1 ...
(define ones
  (letrec ((x (cons 1 (lambda () x))))
    x))

> ones
'(1 . #<procedure>)
> ((cdr ones))
'(1 . #<procedure>)

添加到@molbdnilo answer大多数方案IMeplementation定义
延迟
强制
, 允许创建所谓的流(定义见 )

;无限列表(1。。。
(定义一个(cons 1(延迟一个)))
>一个
(1 . #)
>(部队指挥官)
(1 . #)
(均衡器一个(力(cdr一个)))
#t
delay
force
可以实现为仅仅是lambda表达式的宏。您甚至可以编写处理流的过程,如filter或map

编辑:

同样由R7RS定义,您可以创建带有基准标签的真实圆形列表

(定义x'#0=(a b c.#0#))
x
=>#0=(a b c.#0#)
(等式?x(cdddr x))
#t

如果Scheme完全支持R7RS规范,则应允许以相同的方式定义和显示循环列表。注意,在Kawa Scheme中,它将以循环方式打印,以显示您需要使用的循环列表<代码>(写x)

我猜这是不可能的,因为Scheme很急切,但也许你可以用Y操作符做一些有趣的事情。所以答案似乎是:“不,除非你改变
cons
的含义。”。谢谢!这比使用
letrec
@EllenSpertus的解决方案更简单、更纯粹。我还需要做一个更新,因为R7RS中定义的方案还允许创建带有基准标签的循环列表。
> (eq? ones ((cdr ones)))
#t