重载结构构造函数

时间:2014-01-22 16:22:16

标签: racket

有没有办法为Racket中的结构重载构造函数,所以我可以使继承的参数可选?

就我而言,我想为我的应用定义一些自定义异常。 例如:

(struct exn:my-app exn ())
(struct exn:my-app:illegal-access exn:my-app ())

但是,为了实例化非法访问异常,我必须使用从exn(message和continuation-marks)继承的2个参数来调用构造函数,这非常麻烦。

是否可以定义(对于exn:my-app及其所有后代)一个构造函数,它可以使两个参数都是可选的?所以我可以打电话给:

(raise (exn:my-app:illegal-access))
(raise (exn:my-app:illegal-access "Message")) ?

谢谢,

1 个答案:

答案 0 :(得分:4)

这是一种方法:

(struct exn:my-app exn ()
        ;; change the name of the constructor
        #:constructor-name make-exn:my-app)

;; custom constructor
(define (exn:my-app [msg "default msg"]
                    [marks (current-continuation-marks)])
  (make-exn:my-app msg marks))

(exn:my-app) ; this works now

由于您需要为每种结构类型执行此操作,因此您可能希望定义一个对此进行抽象的宏。我打赌有人已经在Racket邮件列表上分享了这样一个宏,但我不记得我的头脑中的一个,所以如果我找到参考,我会更新这个答案。