这是一个导出哈希表的库。该库还包含填充哈希表的表达式:
(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))
同样,通过这种解决方法散布表达式和定义是否有缺点?