【问题标题】:Scheme what does #= as output mean?计划 #= 作为输出是什么意思?
【发布时间】:2016-11-04 15:05:16
【问题描述】:

您好,我正在尝试学习 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 方案设置为语言。

这个标签是什么意思?是否可能创建一个指向自身的指针,例如(a [pointer to circ]),在这种情况下,它会像某种无限循环或其他东西?

我的意思是如果我这样做:

(定义 x '(a b))

(set-cdr!x 'c)

x

=>(a.c) ;是输出

这很容易理解为 set-cdr!用 'c 替换 (b '()) 并在最后去掉 '() 是为什么我得到一个点对而不是一个列表。但这不符合前面的例子。

无论如何,如果有人愿意填写我的信息,请告诉我。提前致谢。

【问题讨论】:

    标签: scheme hashtag side-effects


    【解决方案1】:

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

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

    这是set-cdr!之后的情况:

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

    【讨论】:

    • 谢谢。我想我也从这个(和其他例子)思考#something 是当被评估的符号没有像字符串或数字那样的打印表示时,Scheme 将输出的内容。
    • 啊这比我想象的更有帮助,因为我没有得到一般的列表的每个元素都是具有 2 个值的 cons 单元格。第一个是实际值,第二个是到下一个 cons 单元格的链接。我想这应该是显而易见的,但它只是沉没在看你发布的这些图纸,这就是为什么我不明白发生了什么。所以列表的尾部是一个 cons 单元格,其值为 car,而不是链接,它具有 null 或 '() 空列表符号作为 cdr。我认为列表的每个元素都是一个值。再次感谢。
    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2023-03-18
    • 2013-03-27
    相关资源
    最近更新 更多