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

时间:2012-02-06 15:15:33

标签: reference scheme

我是学生,明天参加考试,我看到去年有这样一个问题:编写一个区分'(a b)(list 'a 'b)的方案代码,不使用副作用(no { {1}},set! ..)
我不知道该怎么做。有人有想法吗?

存在差异的原因是set-car!在内存中创建了一个静态对象,该对象被引用。 '(a b)是一个创建动态内存对象的应用程序。


我的老师期望一个代码根据输入提供不同的答案,或者一个输入会导致无限循环。

使用副作用的代码示例:

(list '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的情况下每次调用(list 'a 'b)时都会创建新列表。

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

1 个答案:

答案 0 :(得分:3)

对于可以通过内存位置区分对象的问题有一个假设。请参阅第6.1节中的Equivalence Predicates,尤其是 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))

定义明确。