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}意思作为一个整体是什么意思,这是一个什么样的内存地址?
(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)
获取使用不同对象初始化的数组.