从库中导出填充的哈希表

时间:2011-06-30 17:02:51

标签: scheme r6rs

这是一个导出哈希表的库。该库还包含填充哈希表的表达式:

(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))

同样,通过这种解决方法散布表达式和定义是否存在缺陷?

1 个答案:

答案 0 :(得分:2)

其中任何一个都没有大问题。也许将no-op更改为dummy,以澄清它是一个从未使用的绑定。

顶级副作用表达式唯一可能的问题是,在某些实现中,当您认为它们应该时,它们可能不会被执行。 R6RS允许"隐式定相",这意味着您只需导入一些库,并且语言会根据其标识符的使用位置将其置于正确的阶段。因此,在这样的实现中(例如,Ikarus),如果你只是导入一个库而不是使用它的标识符,那么库就不会被实例化 - 所以一个库只是用来打印一些东西的时候#39 ; s导入将不会这样做,除非它还导出一些绑定,并且导入方提到绑定某处。

但在你的情况下,这不会成为一个问题。