这段来自于《On Lisp》的内容真的很令人困惑——不清楚返回一个类似于'(oh my)
的引用列表实际上如何能够改变函数在未来的行为方式:下一次调用该函数时,返回的列表难道不会再次从头开始生成吗?
如果我们定义exclaim,使其返回值包含了一个引用列表,
(defun exclaim (expression) (append expression ’(oh my)))
那么返回值的任何后续破坏性修改
(exclaim ’(lions and tigers and bears)) -> (LIONS AND TIGERS AND BEARS OH MY) (nconc * ’(goodness)) -> (LIONS AND TIGERS AND BEARS OH MY GOODNESS)
可以在函数内更改列表:
(exclaim ’(fixnums and bignums and floats)) -> (FIXNUMS AND BIGNUMS AND FLOATS OH MY GOODNESS)
为了使表达对这些问题具有免疫力,应该这样写:
那最后一次调用
(defun exclaim (expression) (append expression (list ’oh ’my)))
exclaim
是如何把单词goodness
添加到结果中的?该函数没有引用任何外部变量,所以独立调用nconc
如何实际改变了exclaim
函数的工作方式?答案就在于nconc
修改了words
的值,这也影响到了exclaim
函数。