您将如何在Scheme中实现自己的set!
函数? set!
函数是一种破坏性过程,会更改考虑到先前值而定义的值。
如注释中所述,set!
是Scheme中必须由实现提供的原语。同样,您无法在大多数编程语言中实现赋值运算符set!
。在Common Lisp中,可以扩展=
(使用setf
-扩展器)以允许setf
处理新的表格。
因为Scheme的(setf form value)
仅修改变量绑定(例如Common Lisp的set!
),所以仍然值得问一下如何实现类似setq
和其他结构修饰符的函数。从某种意义上讲,这可以看作是对变量的赋值[[generalization,但是由于词汇变量(以及闭包)足以表示任意复杂的结构,因此也可以将其视为更[set-car!
来实现。这是一个典型的练习,展示了如何单独使用词汇闭包来实现结构(例如cons单元格)。这是一个显示单值可变单元格实现的示例::set!
(define (make-cell value)
(lambda (op)
(case op
((update)
(lambda (new-value)
(set! value new-value)))
((retrieve)
(lambda ()
value)))))
(define (set-value! cell new-value)
((cell 'update) new-value))
(define (get-value cell)
((cell 'retrieve)))
开头的单元格,使用我们的4
将其值更新为8
,并获取新值:set-value!