方案#=输出是什么意思?

时间:2016-11-04 15:05:17

标签: scheme hashtag side-effects

您好我正在尝试学习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'())并在最后删除'(),这就是为什么我得到一个虚线对而不是列表。但这不符合前面的例子。

无论如何,如果有人关心我,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:4)

您认为该操作是创建循环列表是正确的。

通过cons单元格绘制列表,这是在define之后的情况:

focus event ignores additional data when triggered

这是set-cdr!

之后的情况

enter image description here

请注意,修改是在circ的cdr的cdr上(所以在第二个单元的cdr上)。 lisp语言中的符号#0=(a b . #0#)描述了一个不正确的列表,其中最后一个cdr等于列表本身,产生循环数据结构(即带有“循环”的数据结构)。