您好我正在尝试学习Scheme,我正在从大学网站上学习一个例子:
https://courses.cs.washington.edu/courses/cse341/05au/lectures/scheme-side-effects.html
这个例子就是这样的:
(定义circ'(a b))
(set-cdr!(cdr circ)circ)
这是输出:
=> #0 =(a b。#0#)
我不明白这意味着什么。该代码将一个名为circ的变量定义为一个包含2个元素的列表(a b)。
设置CDR!改变这个列表的cdr [是(b'())]并将其改为circ(即(a b))。
所以我在这里预期的输出是(a(a b)),但我得到了这个奇怪的#标签。
我正在使用DrRacket IDE并将R5RS方案设置为语言。
这个标签的含义是什么意思?它是否可能创建一个指向自身的指针(如[指向circ的指针])在这种情况下它会像某种无限循环或某种东西?
我的意思是如果我这样做:
(定义x'(a b))
(set-cdr!x'c)
X
=>(a.c);是输出
这很容易理解为set-cdr!用'c替换(b'())并在最后删除'(),这就是为什么我得到一个虚线对而不是列表。但这不符合前面的例子。
无论如何,如果有人关心我,请告诉我。提前谢谢。
答案 0 :(得分:4)
您认为该操作是创建循环列表是正确的。
通过cons单元格绘制列表,这是在define之后的情况:
focus event ignores additional data when triggered
这是set-cdr!
:
请注意,修改是在circ
的cdr的cdr上(所以在第二个单元的cdr上)。 lisp语言中的符号#0=(a b . #0#)
描述了一个不正确的列表,其中最后一个cdr等于列表本身,产生循环数据结构(即带有“循环”的数据结构)。