Common Lisp:defstruct构造函数和(声明(类型blahblah blah))?

时间:2014-05-21 07:22:43

标签: constructor common-lisp declare

假设我有这个:

(defstruct (derp (:constructor make-derp (&key (dimension 4)))) (some-bits (make-array (list dimension dimension) :element-type 'bit :initial-element 0)))

我希望能够(声明(输入...)blahblahblah)'dimension'参数。现在它接受任何价值。当然,make-array会在0或更少时出错,但我也想声明类型在一个范围内,或者我想要使用的其他任何声明类型。

所以无论如何,我尝试将(声明(类型(整数1 32)维))添加到此defstruct中的各个位置,但它总是会产生不同的错误。

通过Google随意搜索这些条款,没有运气。

这可以以某种方式完成吗?

1 个答案:

答案 0 :(得分:4)

你为什么要宣布它?为什么不检查类型?

(defstruct (derp
            (:constructor
             make-derp (&key (dimension 4))))
  (some-bits (progn
               (check-type dimension (integer 0 10))
               (make-array (list dimension dimension)
                         :element-type 'bit
                         :initial-element 0))))

一般来说,上面可能不够强大。然后,我建议编写一个MAKE-SOMETHING函数,该函数会提前进行检查。

请注意,您还可以声明插槽本身的类型。有些CL会在某些情况下检查。