Экспорт заполненной хеш-таблицы из библиотеки
Вот библиотека, которая экспортирует хеш-таблицу. Библиотека также содержит выражения, которые заполняют хеш-таблицу:
(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 ответ
Там нет больших проблем с любым из них. Может измениться no-op
в dummy
уточнить, что это связывание, которое никогда не используется.
Единственная возможная проблема с выражениями побочных эффектов состоит в том, что в некоторых реализациях они могут не выполняться, когда вы думаете, что должны. R6RS допускает "неявную фазировку", что означает, что вы просто импортируете некоторую библиотеку, и язык переводит ее в правильную фазу в зависимости от того, где используются ее идентификаторы. Таким образом, в такой реализации (например, Ikarus), если вы просто импортируете библиотеку, но не используете ее идентификаторы, библиотека не будет создана - так что библиотека, которая просто используется для печати некоторых вещей, когда она импортируется, не будет делать поэтому, если он также не экспортирует какую-либо привязку, а сторона импорта упоминает эту привязку где-то.
Но это не будет проблемой в вашем случае.