Lisp:如何获取表示为列表列表的二维矩阵中元素的引用(而不是值)?

Lisp: How to get the reference (not the value) of an element in a 2D Matrix represented as a List of Lists?

我正在尝试 引用 表示为列表列表的二维矩阵中的特定元素,因此我可以将该特定元素设置为 0。但是,当我 运行 下面的代码:

(defvar listOfLists '( (1 3) (2 6) ))
(defvar referenceToTopLeftCorner (nth 0 (nth 0 listOfLists)))
(setq referenceToTopLeftCorner 0)
(print (format nil "listsOfLists = ~a" listOfLists))

下面的输出是:

""listsOfLists = ((1 3) (2 6))"

这似乎很奇怪,因为我认为 nth 方法可用于获取列表中的引用?

您称为引用的变量不是引用。

你需要做的

(setf (nth 0 (nth 0 list-of-lists)) 0)

请注意,您也可以这样做

(defvar 1st-list (first list-of-lists))
(setf (first 1st-list) 0)

同样的效果,因为1st-list 引用list-of-lists中的第一个列表。

您也可以使用 define-symbol-macro:

(define-symbol-macro reference-to-top-left-corner
  (first (first list-of-lists)))
(setf reference-to-top-left-corner 0)

因为现在reference-to-top-left-corner真的一个参考。

我强烈建议您不要使用符号宏。 此类高级工具应谨慎使用。

Lisp 没有那种意义上的引用。当然,除了它是 Lisp:它拥有你想要的任何东西。

(defmacro locative (form)               ;in memory of Zetalisp
  `(lambda (&optional (value nil valuep))
     (if valuep
         (setf ,form value)
       ,form)))

(defun valof (locative)                 ;in memory of BCPL
  (funcall locative))

(defun (setf valof) (value locative)
  (funcall locative value))

现在

> (let ((lol (copy-tree '((1 3) (2 6)))))
    (let ((tlc (locative (nth 0 (nth 0 lol)))))
      (print (valof tlc))
      (setf (valof tlc) 8)
      lol))
1
((8 3) (2 6))