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

Arrays Lisp为什么我的对象是同一个实例?,arrays,lisp,common-lisp,Arrays,Lisp,Common Lisp,所以我想重新制作一个程序,使用列表来包含对象,并用数组替换列表 我遇到了一个问题,我的对象是同一个实例 setq arr生成数组3:初始元素生成实例'object:可调t:填充指针3 在执行此代码之后 数组中的所有对象都相同 翻译给了我这个 我知道其他方法可以做到这一点,但我仍然想知道为什么会发生这种情况 如果没有问题的话,使数组成为函数的是什么。它的参数在调用之前进行评估 以下是等效的: (make-array 3 :initial-element (make-ins

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

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

setq arr生成数组3:初始元素生成实例'object:可调t:填充指针3

在执行此代码之后

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

我知道其他方法可以做到这一点,但我仍然想知道为什么会发生这种情况

如果没有问题的话,使数组成为函数的是什么。它的参数在调用之前进行评估

以下是等效的:

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

form make instance对象在调用代码时只计算一次。结果用作数组中每个元素的初始值。这可能有助于了解单数单词initial element not-elements,以及以make开头的运算符通常是函数,因此在调用之前对所有参数进行求值

输出用于不可读的对象。这由表示:

如果提供了initial元素,则它用于初始化新数组的每个元素


假设我们在一个包中,make array不是CL:make array,函数声明为not inline。那么函数和参数的求值顺序的语义是什么呢。表示对参数求值,然后从词法环境中检索运算符的函数值,然后调用函数。模编译器优化,答案中的等价性似乎是正确的。正如我所说的:在一般情况下,函数是否从绑定/全局符号函数单元中实际检索是一个实现细节。。例如,允许文件编译器假定对同一文件中的函数的调用始终是该函数。或者,如果函数被声明为内联的,编译器可以内联它。或者,如果编译器自己选择内联某些函数…通常,提醒用户第二个表单实际可以工作是很有用的-这可能会让一些用户感到惊讶,因为他们没有看到以这种方式调用带有关键字参数的函数。要打印对象,请执行以下操作:
(let ((a 3)
      (b :initial-element)
      (c (make-instance 'object))
      (d :adjustable)
      (e t)
      (f :fill-pointer)
      (g 3))
  (make-array a b c d e f g))
(map-into (make-array 3 :adjustable t :fill-pointer 3)
          (lambda () (make-instance 'object)))