是否可以在 Scheme中使用宏来实现set-car!
和set-cdr!
移植?set!
或者这是否需要对底层存储系统进行特殊访问?
我之所以问,是因为我正在实现自己的 Scheme 解释器,并且我希望尽可能多地使用方案代码。
我的第一次尝试set-cdr!
是:
(define-syntax set-cdr!
(syntax-rules ()
((set-cdr! location value)
(set! location (cons (car location) value)))))
这主要适用,但不适用于循环列表:
#; mickey> (define x (list 1 2))
#; mickey> x
(1 2)
#; mickey> (set-cdr! x x)
#; mickey> x
(1 1 2)
包裹宏体let
也对我没有帮助,因为当我这样做时(set! (cons (car location) value)
, thenvalue
已经被评估为'(1 2)
.