类可以在common-lisp中有多个构造函数和/或复制构造函数吗?那就是 - 为了创建一个新的向量类 - “vecr”来表示实数的三维向量,我想定义可以多种方式初始化的新类:
(vecr 1.2) ==> #(1.2 1.2 1.2)
或
(vecr 1.2 1.4 3.2) ==> #(1.2 4.3 2.5)
或
(vecr) ==> #(0.0 0.0 0.0)
答案 0 :(得分:7)
我无法弄清楚如何评论上述内容:
此功能可以很好地创建一个 默认#(0.0 0.0 0.0)向量类型。 但是,(vecr 1.0)==> #(1.0 0.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))
答案 1 :(得分:4)
一个简单的方法是:
(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)))
答案 2 :(得分:3)
Lisp中没有“构造函数”或“复制构造函数”,与C ++中的含义相同。
lisp中的类使用make-instance实例化,并通过引用传递。这意味着没有复制。
至于你的问题,你可以创建一个实例化类的函数,并将所需的参数传递给make-instance函数或以其他方式初始化实例。
在您的情况下,最简单的方法是使用这样的函数:
(defun vecr (&optional (x 0.0) (y 0.0) (z 0.0))
(vector x y z))
答案 3 :(得分:3)
参见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)