我是学生,明天参加考试,我看到去年有这样一个问题:编写一个区分'(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)
时都会创建新列表。
对于那些抱怨问题不好的人:课程是关于编译器的,他希望我们了解在代码生成之前一切都有什么影响。
答案 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))
定义明确。