2013-06-24 47 views
2

我一直在使用以下語言定義文件,eopl-printing.rkt, 球拍exn:失敗? unbound

#lang racket 
    (require (except-in eopl #%module-begin)) 
    (provide (all-from-out eopl)) 
    (provide #%module-begin)
正如 DrRacket EOPL Scheme output中所建議的那樣。所有這些,都被順利,除了當我嘗試調用函數的exn如:

#lang s-exp "eopl-printing.rkt" 
(require rackunit) 
(check-exn 
    exn:fail? 
    (lambda() 
    (error 'hi "there")))

代替試驗成功通過如預期的,我得到一個「EXN:失敗?:綁定標識符...」消息。我已經閱讀了關於模塊的文檔,並嘗試了各種方法來嘗試重新揭露Racket exn的定義,但沒有任何運氣。有什麼建議麼?

回答

3

eopl-printing.rkt文件定義了語言,只包括從eopl庫中的綁定以及從racket但沒有別的#%module-begin

但你仍然可以輕鬆地導入racket綁定在寫在eopl-printing.rkt語言的任何文件:

#lang s-exp "eopl-printing.rkt" 
(require rackunit) 
(require racket) 
(check-exn 
    exn:fail? 
    (lambda() 
    (error 'hi "there"))) 

或者,你可以有你eopl-printing.rkt語言提供所需的額外racket形式:

#lang racket 
(require (except-in eopl #%module-begin)) 
(provide (all-from-out eopl)) 
(provide #%module-begin exn:fail? error) 

或只是重新提供racket中的所有內容:

#lang racket 
(require (except-in eopl #%module-begin)) 
(provide (all-from-out eopl)) 
(provide (all-from-out racket)) 
+0

謝謝,這是有道理的。在名稱衝突的情況下,第一個和第三個選項是否會帶來球拍覆蓋eopl的風險? –

+0

可能。我運行了'eopl'測試套件,但沒有遇到任何問題。無論如何,'eopl'大多隻是重新提供'racket'的東西。而且它看起來好像重新定義了一些東西,比如'eopl:printf'和'eopl:error' – stchang

+0

實際上,抓住最後的評論。我認爲['all-from-out'](http://docs.racket-lang.org/reference/require.html?q=all-from-out#%28form._%28%28lib._racket%2Fprivate %2Fbase..rkt%29._all-from-out%29%29)做對了。如果發生衝突會有錯誤。 – stchang