/ / Уникайте відображення тричі структури - схеми, ракетки, загального інтерфейсу

Уникайте показу 3 рази структурної схеми, ракети, загальної інтерфейсу

Я визначив структуру, як показано нижче,

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

Але я отримую дивну поведінку в REPL, де структура відображається 3 рази:

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

Напевно, я роблю щось не так, але не можу знайти свою проблему. Хто-небудь може пояснити мені, чому у мене є три рази на вихід?

Відповіді:

6 за відповідь № 1

Напрямуйте вихід на вихідний порт, і все працює:

#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 для відповіді № 2

Вам потрібно скористатись port поставляється до 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)))])

Менш утомливим способом зробити це буде зміна 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 ">"))))])