Reference 如何区分常量列表和动态创建的列表?

Reference 如何区分常量列表和动态创建的列表?,reference,scheme,Reference,Scheme,我是一名学生,明天有一个测试,我看到去年有一个问题:编写一个方案代码,区分(a b)和(列出“a”b),而不使用副作用(无设置!,设置汽车!) 我不知道怎么做。有人有主意吗 存在差异的原因是”(a b)在内存中创建了一个被引用的静态对象。(列表“a”b)是一个创建动态内存对象的应用程序 我的老师希望代码要么根据输入给出不同的答案,要么一个输入导致无限循环 使用副作用的代码示例: (define lst (lambda () '(a b))) (set-car! (lst) 'g) (displ

我是一名学生,明天有一个测试,我看到去年有一个问题:编写一个方案代码,区分
(a b)
(列出“a”b)
,而不使用副作用(无
设置!
设置汽车!

我不知道怎么做。有人有主意吗

存在差异的原因是
”(a b)
在内存中创建了一个被引用的静态对象。
(列表“a”b)
是一个创建动态内存对象的应用程序


我的老师希望代码要么根据输入给出不同的答案,要么一个输入导致无限循环

使用副作用的代码示例:

(define lst (lambda () '(a b)))
(set-car! (lst) 'g)
(display (lst)) (newline)
;;; prints (g b)

(define lst1 (lambda () (list 'a 'b)))
(set-car! (lst1) 'g)
(display (lst1)) (newline)
;;; prints (a b)
原因是
lambda
延迟了值的计算,并且在
(列表“a”b)
的情况下,每次调用
(lst1)
时都会创建一个新列表


对于那些抱怨这个问题不好的人来说:这门课程是关于编译器的,他希望我们了解在代码生成之前一切都有什么影响。

对于这个问题有一个假设,即对象可以通过内存位置来区分。参见第6.1节,特别是eqv?的说明

具体而言:

(define x '(a b))
(define y (list 'a 'b))

(eqv? x y)
(eqv? y x)
(eqv? x x)
(eqv? y y)
它们都有明确定义的值

正如你所注意到的

(eqv? '(a b) '(a b))
是特定于实现的。如果你的考题是问在一个未定义的变量中会发生什么,我很想回答“Foo”。)没有更多的背景,这是一个毫无意义的问题

另一方面,

(eqv? (list 'a 'b) (list 'a 'b))

定义良好。

是否动态写入?(见标题)我认为这通常是不可能的。也许在具体的实现上,但我不明白重点。同意。如上所述的测验问题似乎构造得很糟糕,因为它离行为依赖于实现的地方(即未定义的行为)非常近。关于不使用可变性的整个事情扼杀了使这个主题对真正的程序员真正有用的东西。它说的是情商?那么eqv呢?具体情况不详。这有什么帮助?2.在标准方案中也是这样吗?或者只是在R5R中?并不是所有的东西都是未指定的。对于你的问答题描述的非常狭窄的情况,eq?那么eqv呢?可以区分“(1 2)和(列表1 2)之间的区别。但正如前面所评论的,是的,这个问题不是很好。使问题更相关的是比较可变值,比如向量,实际上,为了理解问题,有一个记忆的心理模型是很重要的。在这种情况下,eqv?好吧,问题是好是坏与我无关——我要么回答,要么不懂要点关于eqv?对于(eqv?'(ab)'(ab)),它是未定义的-因此(例如在chez方案中)你无法判断你是测试了(eqv?'(ab)'(ab)还是(eqv?'(ab)(列表“a”b))-我更新了这个问题。我不能为其他讲师说话,但我声称,一个措辞得体的解释为什么这个问题不是一个好问题应该值得满分。