2011-06-30 5 views
0

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?

Répondre

2

Il n'y a pas de gros problèmes avec l'un ou l'autre. Peut-être changer no-op en dummy pour clarifier que c'est une liaison qui n'est jamais utilisée. Le seul problème possible avec les expressions d'effets secondaires de haut niveau est que, dans certaines implémentations, elles peuvent ne pas être exécutées lorsque vous le pensez. R6RS autorise la "mise en phase implicite", ce qui signifie que vous venez d'importer une bibliothèque et que le langage l'obtient dans la phase correcte en fonction de l'endroit où ses identifiants sont utilisés. Ainsi, dans une telle implémentation (par exemple, Ikarus), si vous importez simplement une bibliothèque mais n'utilisez pas ses identifiants, la bibliothèque ne sera pas instanciée - donc une bibliothèque qui est simplement utilisée pour imprimer des choses quand elle est importée ne le fera pas donc à moins qu'il n'exporte aussi de la liaison, et le côté importateur mentionne cette liaison quelque part.

Mais ce ne sera pas un problème dans votre cas.

Questions connexes