这是一个导出哈希表的库。该库还包含填充哈希表的表达式:
(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))
同样,通过这种解决方法散布表达式和定义是否存在缺陷?
答案 0 :(得分:2)
其中任何一个都没有大问题。也许将no-op
更改为dummy
,以澄清它是一个从未使用的绑定。
顶级副作用表达式唯一可能的问题是,在某些实现中,当您认为它们应该时,它们可能不会被执行。 R6RS允许"隐式定相",这意味着您只需导入一些库,并且语言会根据其标识符的使用位置将其置于正确的阶段。因此,在这样的实现中(例如,Ikarus),如果你只是导入一个库而不是使用它的标识符,那么库就不会被实例化 - 所以一个库只是用来打印一些东西的时候#39 ; s导入将不会这样做,除非它还导出一些绑定,并且导入方提到绑定某处。
但在你的情况下,这不会成为一个问题。