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

jak*_*ter 0 lisp arrays common-lisp

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

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

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

在此代码执行之后

数组中的所有对象都是相同的,解释器给了我这个

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

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

如果不是什么#<OBJECT {1002DFDD23}意思作为一个整体是什么意思,这是一个什么样的内存地址?

Sva*_*nte 6

(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)))
Run Code Online (Sandbox Code Playgroud)

获取使用不同对象初始化的数组.