Avoid displaying 3 times the structure

I defined the structure as shown below

(struct vector (xyz) #: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 ">")))]) 

But I get weird behavior in REPL, where the structure is displayed 3 times:

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

I have to do something wrong, but I can not find my problem. Can someone explain to me why I have 3 times out?

+7
scheme racket
source share
2 answers

Direct the output to the output port and everything will work:

 #lang racket (struct vector (xyz) #: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)))]) 
+6
source share

You need to use port for write-proc :

 (struct vector (xyz) #: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)))]) 

A less tedious way would be to change current-output-port :

 (struct vector (xyz) #: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 ">"))))]) 
+5
source share

All Articles