2010-02-02 11 views
4

Je voudrais code comme ceci:Comment imprimer des structures dans PLT Scheme afin d'afficher leurs champs?

(define-struct thing (a b c)) 
(define th (make-thing 1 2 3)) 

pour imprimer quelque chose comme ceci:

(make-thing 1 2 3) 

quand je tape "e" soit dans le rempl DrScheme ou MzScheme. J'utilise le langage "assez grand" dans DrScheme avec le style de sortie défini sur "constructeur". C'est ce que je reçois dans DrScheme:

(make-thing ...) 

(je reçois littéralement les trois points)

En MzScheme:

#<thing> 

Répondre

7

Il y a plusieurs façons de le faire. La plus évidente est d'utiliser:

(define-struct thing (a b c) #:transparent) 

ce qui rend la struct accessible pour le type d'inspection bas niveau que l'impression ne. Une autre alternative est d'utiliser votre propre imprimante:

(define-struct thing (a b c) 
    #:property prop:custom-write 
    (lambda (thing port write?) 
    (fprintf port (if write? "{~s,~s,~s}" "{~a,~a,~a}") 
      (thing-a thing) (thing-b thing) (thing-c thing)))) 

Mais notez que le style de sortie "constructeur" essaie d'écrire certaines choses différemment. Notez également que vous pouvez combiner ces deux éléments pour qu'ils aient leur propre auteur et qu'ils soient transparents. (Rendre transparent permet en principe à n'importe quel code d'accéder aux champs dans une instance thing, par exemple, equal? peut y creuser.)

Enfin, pour certaines utilisations, une installation plus adaptée consiste à utiliser «préfabriqué». struct:

(define-struct thing (a b c) #:prefab) 

que se passe généralement est que chaque define-struct génère un nouveau type, même si l'on était déjà défini. Mais avec une structure préfabriquée, c'est comme s'il y avait un type qui existait déjà et que vous liez simplement certaines fonctions (le constructeur, le prédicat et les accesseurs) pour travailler avec ce type préexistant.