2011-06-30 92 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-opdummy以澄清它是從未使用的綁定。

頂級副作用表達式唯一可能的問題是,在某些實現中,它們可能不會在您認爲應該執行時執行。 R6RS允許「隱式階段化」,這意味着您只需導入某個庫,並且語言根據其標識符的使用位置將其置於正確的階段。所以,在這樣的實現中(例如Ikarus),如果你只是導入一個庫而不使用它的標識符,庫就不會被實例化 - 所以一個僅僅用於在導入時打印一些東西的庫不會做所以除非它也在導出一些綁定,並且導入端在某處提到綁定。

但是,這不會成爲你的情況下的問題。