我现在已经了解了数组和arefLisp.到目前为止,它很容易掌握,它就像一个魅力:
(defparameter *foo* (make-array 5))
(aref *foo* 0) ; => nil
(setf (aref *foo* 0) 23)
(aref *foo* 0) ; => 23
Run Code Online (Sandbox Code Playgroud)
令我百思不解的是aref"神奇"当你把这种情况发生aref和setf.似乎aref知道它的调用上下文,然后决定是否返回一个值或一个可以使用的地方setf.
无论如何,目前我只是认为这是理所当然的,并且不要考虑内部工作方式太多.
但是现在我想创建一个将*foo*数组元素设置为预定义值的函数,但是我不想对*foo*数组进行硬编码,而是想要移交一个地方:
(defun set-23 (place)
…)
Run Code Online (Sandbox Code Playgroud)
所以基本上这个函数集放置到23,任何地方.我最初的天真的方法是
(defun set-23 (place)
(setf place 23))
Run Code Online (Sandbox Code Playgroud)
并使用以下方式调用:
(set-23 (aref *foo* 0))
Run Code Online (Sandbox Code Playgroud)
这不会导致错误,但也不会发生任何变化*foo*.我的猜测是aref解析的调用nil(因为数组当前是空的),所以这意味着
(setf nil 23)
Run Code Online (Sandbox Code Playgroud)
运行,但是当我在REPL中手动尝试时,我收到一个错误告诉我:
NIL是常量,不能用作变量
(这绝对有道理!)
所以,最后我有两个问题:
set-23功能发挥作用?我也有想法使用thunk来推迟执行aref,就像: …