Voici une bibliothèque qui exporte une hashtable. La bibliothèque contient également des expressions qui peuplent la Hashtable:Exportation d'une table de hachage remplie à partir d'une bibliothèque
(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))
Voici une autre version de la bibliothèque qui exporte une procédure qui peut être utilisé pour alimenter le Hashtable:
(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)))
Est-il considéré comme une mauvaise forme de prendre la première approche? C'est à dire. avoir une bibliothèque qui exécute aussi des expressions arbitraires? Y a-t-il des inconvénients à cette approche? Problème connexe ... Dans une bibliothèque, les expressions non définies doivent apparaître après les définitions. Pour contourner cette contrainte, j'utilise cette macro:
(define-syntax no-op-def
(syntax-rules()
((_ expr ...)
(define no-op
(begin
expr
...)))))
par exemple:
(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))
Encore une fois, y at-il des inconvénients à intercalant expressions et définitions via cette solution de contournement?