/ / Vyhnite sa zobrazeniu 3-krát štruktúry - schémy, rakety, generického rozhrania

Vyhýbajte sa trojnásobnému zobrazeniu štruktúry, rakety, generického rozhrania

Definujem štruktúru ako je uvedené nižšie,

(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 ">")))])

Ale dostávam podivné správanie v REPL, kde sa štruktúra zobrazuje 3 krát:

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

Musím robiť niečo zlé, ale nemôžem nájsť môj problém. Môže mi niekto explin, prečo mám 3 čas výstup?

odpovede:

6 pre odpoveď č. 1

Nasmerujte výstup do výstupného portu a všetko funguje:

#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 pre odpoveď № 2

Musíte použiť port dodávané do 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)))])

Menej zdĺhavý spôsob, ako to urobiť, by bolo zmeniť 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 ">"))))])