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

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

4

1 回答 1

2

这些都没有大问题。也许更改no-opdummy澄清它是一个从未使用过的绑定。

顶级副作用表达式的唯一可能问题是,在某些实现中,它们可能不会在您认为应该执行的时候执行。R6RS 允许“隐式分阶段”,这意味着您只需导入一些库,该语言就会根据其标识符的使用位置将其置于正确的阶段。因此,在这样的实现中(例如,Ikarus),如果您只导入一个库但不使用它的标识符,则该库将不会被实例化——因此,一个仅用于在导入时打印某些内容的库将不会做因此,除非它还导出了一些绑定,并且导入方在某处提到了该绑定。

但这对你来说不是问题。

于 2011-06-30T17:31:59.960 回答