2014-01-22 41 views
2

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

就我而言,我想为我的应用程序定义一些自定义例外。 例如:

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

然而,实例化一个非法存取例外,我必须调用与来自EXN(消息和继续标记)继承了2个参数,这是相当麻烦的构造。

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

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

感谢,

+0

Scheme没有重载你正在考虑的那种,但它确实有可选参数,它确实有'case-lambda'(虽然不知道你是否可以使用它作为结构体)。 –

回答

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邮件列表上分享了这样一个宏,但是我不记得有一个关于我的头脑,所以如果我找到一个参考,我会更新这个答案。

+0

好点!那么,最后我终于定义了一个自定义的提升方法,取出了异常和2个自定义参数;这是更少的工作。 ;) 谢谢! –

+1

作为[这个问题](https://stackoverflow.com/questions/38131934/overloading-a-struct-constructor)指出,如果我现在运行这个例子,我得到一个错误信息:'。模块:标识符的重复定义:exn:my-app' –