Экспорт заполненной хеш-таблицы из библиотеки - PullRequest
0 голосов
/ 30 июня 2011

Вот библиотека, которая экспортирует хеш-таблицу.Библиотека также содержит выражения, которые заполняют хеш-таблицу:

(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 Ответ

2 голосов
/ 30 июня 2011

Нет больших проблем ни с одним из них. Возможно, измените no-op на dummy, чтобы уточнить, что это привязка, которая никогда не используется.

Единственная возможная проблема, связанная с выражениями побочных эффектов, состоит в том, что в некоторых реализациях они могут не выполняться, когда вы думаете, что должны. R6RS допускает «неявную фазировку», что означает, что вы просто импортируете некоторую библиотеку, и язык переводит ее в правильную фазу в зависимости от того, где используются ее идентификаторы. Таким образом, в такой реализации (например, Ikarus), если вы просто импортируете библиотеку, но не используете ее идентификаторы, библиотека не будет создана - так что библиотека, которая просто используется для печати некоторых вещей, когда она импортирована, не будет поэтому, если он также не экспортирует какую-либо привязку, а сторона импорта упоминает эту привязку где-то.

Но в вашем случае это не будет проблемой.

...