首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案-定义列表与符号

方案-定义列表与符号
EN

Stack Overflow用户
提问于 2011-12-31 18:54:36
回答 1查看 751关注 0票数 4

我试图找出Scheme中发生的一些有趣的事情:

代码语言:javascript
复制
(define last-pair
     (lambda (x)
       (if (null? (cdr x))
           x
           (last-pair (cdr x)))))

当我这样定义foo时:

代码语言:javascript
复制
(define foo
  (lambda ()
    (let ((s (list 'he 'said:)))
      (set-cdr! (last-pair s)
                (list 'ha 'ha))
      s)))

然后运行foo 3次,我得到了:

代码语言:javascript
复制
(he said: ha ha)
(he said: ha ha)
(he said: ha ha)

但当我这样定义foo时:

代码语言:javascript
复制
(define foo
  (lambda ()
    (let ((s '(he said:))) 
      (set-cdr! (last-pair s)
                (list 'ha 'ha))
      s)))

然后运行foo 3次,我得到了:

代码语言:javascript
复制
(he said: ha ha)
(he said: ha ha ha ha)
(he said: ha ha ha ha ha ha)

但是为什么呢?我的第一个想法是在第一个foo中创建总是新的列表,而在第二个中我们不这样做,但我不明白它是如何工作的。方案在第二个foo中定义地址,然后做什么?它是否也在第二个foo中定义为列表?或者是一个符号?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-01 01:22:08

文字列表(与(list 'foo 'bar 'baz)相对的是'(foo bar baz))是not allowed to be mutated。如果你这样做了,这“是一个错误”(即,行为是未定义的)。

在这种情况下,您观察到的是文字'(he said:)被一次又一次地重用,并理解它不会发生变化。既然你违反了这个理解,你就会得到你所看到的奇怪的行为。

相反,当您使用(list 'he 'said:)时,每次都会返回一个新的列表。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8687700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档