gpt4 book ai didi

lisp - 奇怪的 Lisp 引用场景 - Graham 的 On Lisp,第 37 页

转载 作者:太空宇宙 更新时间:2023-11-03 18:33:25 24 4
gpt4 key购买 nike

我正在阅读 Graham 的“On Lisp”一书,但无法理解第 37 页的以下示例:

If we define exclaim so that its return valueincorporates a quoted list,(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)could alter the list within the function:> (exclaim ’(fixnums and bignums and floats))(FIXNUMS AND BIGNUMS AND FLOATS OH MY GOODNESS)To make exclaim proof against such problems, it should be written:(defun exclaim (expression)  (append expression (list ’oh ’my)))

有人知道这里发生了什么吗?这严重扰乱了我对引用功能的心智模型。

最佳答案

nconc 是一种破坏性操作,它通过改变其尾部来改变其第一个参数。在这种情况下,这意味着常量列表 '(oh my) 得到了一个新的尾部。

希望能更清楚地说明这一点。有点像这样:

; Hidden variable inside exclaim
oh_my = oh → my → nil

(exclaim '(lions and tigers and bears)) =
lions → and → tigers → and → bears → oh_my

(nconc * '(goodness)) destructively appends goodness to the last result:
lions → and → tigers → and → bears → oh → my → goodness → nil
so now, oh_my = oh → my → goodness → nil

(list 'oh 'my) 替换 '(oh my) 修复了这个问题,因为不再有一个常量被所有人共享。每次调用 exclaim 都会生成一个新列表(list 函数在生活中的目的是创建全新的列表)。

关于lisp - 奇怪的 Lisp 引用场景 - Graham 的 On Lisp,第 37 页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4003115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com