2014-01-22 153 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' –