/ / Evitare di visualizzare 3 volte una struct - schema, racket, interfaccia generica

Evitare di visualizzare 3 volte una struct: schema, racket, interfaccia generica

Ho definito una struttura come di seguito,

(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 sto ottenendo un comportamento strano nel REPL in cui la struttura viene visualizzata 3 volte:

> (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?

risposte:

6 per risposta № 1

Indirizza l'output 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)))])

5 per risposta № 2

Devi usare il port fornito a 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 cambiare 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 ">"))))])