gpt4 book ai didi

arrays - Lisp 为什么我的对象是同一个实例?

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:38 24 4
gpt4 key购买 nike

所以我想重新制作一个程序,使用列表来包含对象并将列表替换为数组。

我遇到了一个问题,我的对象是同一个实例

(setq arr (make-array 3 :initial-element (make-instance 'object) :adjustable t :fill-pointer 3))

这段代码执行后

数组中的所有对象都是相同的翻译给了我这个

#(#<OBJECT {1002DFDD23}> #<OBJECT {1002DFDD23}> #<OBJECT {1002DFDD23}>)

我知道其他方法可以做到这一点,但我仍然想知道为什么会这样?

如果没有问题,#<OBJECT {1002DFDD23} 是什么?表示整体,这是某种内存地址吗?

最佳答案

表格(make-instance 'object)在调用您的代码时仅评估一次。结果用作数组每个元素的初始值。看到单数词 initial-element 可能会有帮助(不是 -elements ),以及以 make- 开头的运算符通常是函数,因此所有参数都在调用之前进行评估。

输出 #<OBJECT {1002DFDD23}>用于不可读的对象。这由 #< 表示语法,定义为在尝试 read 时发出错误信号它(http://clhs.lisp.se/Body/02_dht.htm)。它通常由 print-unreadable-object 产生, 通常在为 print-object 定义方法时使用.因此,确切的输出是实现或用户定义的(无论谁为该特定类编写了 print-object 方法)。默认情况下,它很可能包含类名和内存引用或地址之类的内容。

为了完整起见,我喜欢使用 map-into :

(map-into (make-array 3 :adjustable t :fill-pointer 3)
(lambda () (make-instance 'object)))

获取一个用不同对象初始化的数组。

关于arrays - Lisp 为什么我的对象是同一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993716/

24 4 0
文章推荐: css - 将