相关疑难解决方法(0)

试图理解setf + aref"魔法"

我现在已经了解了数组和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"神奇"当你把这种情况发生arefsetf.似乎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是常量,不能用作变量

(这绝对有道理!)

所以,最后我有两个问题:

  1. 我的样本中发生了什么,这不会导致错误,为什么它不做任何事情?
  2. 我怎么能解决这个问题才能让我的set-23功能发挥作用?

我也有想法使用thunk来推迟执行aref,就像: …

lisp common-lisp

5
推荐指数
2
解决办法
738
查看次数

标签 统计

common-lisp ×1

lisp ×1