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))
我正在尝试 引用 表示为列表列表的二维矩阵中的特定元素,因此我可以将该特定元素设置为 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))