有没有办法为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")) ?
谢谢,
答案 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邮件列表上分享了这样一个宏,但我不记得我的头脑中的一个,所以如果我找到参考,我会更新这个答案。