宏 PUSH 的文档说:
push item place => new-place-value
位置是通用引用:变量、数组槽、结构槽、CLOS 对象槽等等。它们记录在这里:CLHS 5.1 Generalized Reference
泛化是什么意思?在 Common Lisp 中,places 是一个超越变量或槽等简单引用的概念。它甚至是用户可扩展的 -> 可以定义新类型的地点。
NIL 作为一个地方
NIL(与() 相同)记录为常量变量。
因此这样的事情失败了:
(setf nil 10)
(push 10 nil) 正在尝试将10 推送到地点 NIL。
CL-USER 1 > (macroexpand-1 '(push 10 nil))
(LET ((#:|new-value-1070| 10))
(LET* ((#:|Store-Var-1069| (CONS #:|new-value-1070| NIL)))
(SETQ NIL #:|Store-Var-1069|)))
有它:尝试将NIL(作为参考,这里是一个变量)设置为值 10。
由于NIL被定义为一个常量变量并且常量变量是不可改变的,所以不能把东西推到nil的地方。
因此NIL 不是一个有用的地方。
'NIL 作为一个地方
为什么(push 10 '()) 会失败?与(push 10 'nil) 和(push 10 (quote nil)) 相同。
同样,push 需要一个位置。 (quote ...) 不是一个定义的地方。
这里定义了默认定义的地方:CLHS 5.1.2 Kinds of Places。
这是有道理的,因为'() 没有引用任何内容。请记住:地点是一般参考。它应该是一个文字对象()。
功能缺点
如果我们想将新对象添加到列表中,那么我们使用cons:
CL-USER 4 > (cons 10 nil)
(10)
CL-USER 5 > (cons 10 'nil)
(10)
必须使用结果列表:将其存储在某处,将其传递给函数,...