2011-06-30 6 views
0

ハッシュテーブルをエクスポートするライブラリです。また、ライブラリには、ハッシュテーブルを移入表現が含まれていますライブラリーから移入されたハッシュテーブルのエクスポート

(library (abc-1) 

    (export tbl) 

    (import (rnrs)) 

    (define tbl (make-eq-hashtable)) 

    (hashtable-set! tbl 'a 10) 
    (hashtable-set! tbl 'b 20) 
    (hashtable-set! tbl 'c 30)) 

ここでハッシュテーブルを移植するために使用することができます手順をエクスポートするライブラリの別のバージョンです:

(library (abc-2) 

    (export tbl init-tbl) 

    (import (rnrs)) 

    (define tbl (make-eq-hashtable)) 

    (define (init-tbl) 
    (hashtable-set! tbl 'a 10) 
    (hashtable-set! tbl 'b 20) 
    (hashtable-set! tbl 'c 30))) 

はそれが取るために悪いフォームを考えられています最初のアプローチは?私。任意の式も実行するライブラリを持っていますか?このアプローチには欠点がありますか?

関連する問題ライブラリでは、定義の後に非定義式を記述する必要があります。この制約を回避するには、私はこのマクロを使用しています。たとえば

(define-syntax no-op-def 
    (syntax-rules() 
     ((_ expr ...) 
     (define no-op 
     (begin 
      expr 
      ...))))) 

を:再び

(define t0 (make-eq-hashtable)) 

(no-op-def 
    (hashtable-set! t0 'a 10)) 

(define t1 (make-eq-hashtable)) 

(no-op-def 
    (hashtable-set! t1 'b 20)) 

、この回避策を経由して表現や意味を散在するが欠点ですか?

答えて

2

これらのいずれにも大きな問題はありません。たぶんno-opからdummyに変更して、決して使用されていないバインディングであることを明確にしてください。

トップレベルの副作用式で唯一可能性のある問題は、実装によっては、必要と思われるときに実行されないことがあることです。 R6RSは「暗黙のフェージング」を可能にします。つまり、ライブラリをインポートするだけで、識別子が使用されている場所に応じて適切な段階に変換されます。したがって、そのような実装(例えばIkarus)では、ライブラリをインポートしてもその識別子を使用しないと、ライブラリはインスタンス化されません。したがって、インポート時に何かを印刷するために単に使用されるライブラリは、それはまた、いくつかのバインディングをエクスポートしていない限り、インポート側はそのバインディングをどこかに言及しています。

しかし、これは問題ではありません。

関連する問題