常见的lisp中的多个构造函数

时间:2009-11-02 04:24:58

标签: inheritance lisp common-lisp

类可以在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)

4 个答案:

答案 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)