Inheritance 公共lisp中的多个构造函数

Inheritance 公共lisp中的多个构造函数,inheritance,lisp,common-lisp,Inheritance,Lisp,Common Lisp,在公共lisp中,类可以有多个构造函数和/或复制构造函数吗?也就是说,为了创建一个新的向量类-“vecr”来表示实数的三维向量,我想定义一个可以用多种方式初始化的新类: (vecr 1.2) ==> #(1.2 1.2 1.2) 或 或 P>> LISP中没有“构造函数”或“复制构造函数”,与C++相同。 lisp中的类通过make instance实例化,并通过引用传递。这意味着不存在复制 至于您的问题,您可以创建一个函数来实例化一个类,并传递所需的参数以生成实例函数或以其他方式初始

在公共lisp中,类可以有多个构造函数和/或复制构造函数吗?也就是说,为了创建一个新的向量类-“vecr”来表示实数的三维向量,我想定义一个可以用多种方式初始化的新类:

(vecr 1.2) ==> #(1.2 1.2 1.2)

<> P>> LISP中没有“构造函数”或“复制构造函数”,与C++相同。 lisp中的类通过make instance实例化,并通过引用传递。这意味着不存在复制

至于您的问题,您可以创建一个函数来实例化一个类,并传递所需的参数以生成实例函数或以其他方式初始化实例

在您的情况下,最简单的方法是使用如下函数:

(defun vecr (&optional (x 0.0) (y 0.0) (z 0.0))
  (vector x y z))

一个简单的方法是:

(defun vecr (&optional (x 0.0) (y 0.0 y-supplied-p) (z 0.0))
  (if y-supplied-p
      (vector x y z)
      (vector x x x)))

请参见MAKE-ARRAY函数:

CL-USER 1 > (make-array 3 :initial-element 1.2)
#(1.2 1.2 1.2)

CL-USER 2 > (make-array 3 :initial-contents '(1.2 1.4 3.2))
#(1.2 1.4 3.2)

CL-USER 3 > (make-array 3)
#(NIL NIL NIL)

我不知道如何评论上面所说的话:


此函数可以很好地创建 向量的默认#(0.0.0.0)类型。 但是,(vecr 1.0)=>#(1.0.0.0) 而不是预期的#(1.0 1.0 1.0). 我想解决这个问题的办法是检查这三个是否都是正确的 已通过,或者只是可选的 论点–Shamster 6小时前

您可以这样做:

(defun vecr (&optional (x 0.0) (y x) (z y))
  (vector x y z))

此函数可以很好地创建默认的#(0.0.0.0)类型的向量。但是,(vecr1.0)=>#(1.0.0.0)而不是预期的#(1.0 1.0 1.0)。我想解决这个问题的方法是检查这三个参数是否都已传递,或者只是其中一个可选参数。顺便说一句,第三个示例也可能导致
#(0 0 0)
--默认的初始元素依赖于实现。这是一个非常巧妙的解决方案。谢谢
CL-USER 1 > (make-array 3 :initial-element 1.2)
#(1.2 1.2 1.2)

CL-USER 2 > (make-array 3 :initial-contents '(1.2 1.4 3.2))
#(1.2 1.4 3.2)

CL-USER 3 > (make-array 3)
#(NIL NIL NIL)
(defun vecr (&optional (x 0.0) (y x) (z y))
  (vector x y z))