2015-09-02 26 views
7

ho definire una struct come sotto,Evitare la visualizzazione di 3 volta una struct

(struct vector (x y z) 
    #:methods gen:custom-write 
    [(define (write-proc vector port mode) 
    (let ([print (if mode write display)]) 
     (write-string "<") 
     (print (vector-x vector)) 
     (write-string ", ") 
     (print (vector-y vector)) 
     (write-string ", ") 
     (print (vector-z vector)) 
     (write-string ">")))]) 

Ma io sono sempre un comportamento strano nel REPL dove la struct è in corso di visualizzazione 3 tempo:

> (define a (vector 1 2 3)) 
> a 
<1, 2, 3><1, 2, 3><1, 2, 3> 

Devo fare qualcosa di sbagliato ma non riesco a trovare il mio problema. Qualcuno può spiegarmi perché ho 3 volte l'output?

risposta

6

diretto l'uscita alla porta di uscita e tutto funziona:

#lang racket 
(struct vector (x y z) 
    #:methods gen:custom-write 
    [(define (write-proc vector port mode) 
    (let ([print (if mode write display)]) 
     (write-string "<" port) 
     (print (vector-x vector) port) 
     (write-string ", " port) 
     (print (vector-y vector) port) 
     (write-string ", " port) 
     (print (vector-z vector) port) 
     (write-string ">" port)))]) 
+0

Grazie non stavo prestando attenzione a e doc :) – mathk

5

È necessario utilizzare il port in dotazione per write-proc:

(struct vector (x y z) 
    #:methods gen:custom-write 
    [(define (write-proc vector port mode) 
    (let ([print (if mode write display)]) 
     (write-string "<" port) 
     (print (vector-x vector) port) 
     (write-string ", " port) 
     (print (vector-y vector) port) 
     (write-string ", " port) 
     (print (vector-z vector) port) 
     (write-string ">" port)))]) 

Un modo meno noioso per farlo sarebbe quello di cambia current-output-port:

(struct vector (x y z) 
    #:methods gen:custom-write 
    [(define (write-proc vector port mode) 
    (let ([print (if mode write display)]) 
     (parameterize ([current-output-port port]) ;; <== new 
     (write-string "<") 
     (print (vector-x vector)) 
     (write-string ", ") 
     (print (vector-y vector)) 
     (write-string ", ") 
     (print (vector-z vector)) 
     (write-string ">"))))]) 
+1

Oops, vedo @soegaard ha pubblicato una risposta mentre scrivevo il mio. Lo terrò per il suggerimento 'parameterize', credo. –