Scheme 避免在结构中显示3次

Scheme 避免在结构中显示3次,scheme,racket,generic-interface,Scheme,Racket,Generic Interface,我定义了一个结构,如下所示 (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 ", ") (pr

我定义了一个结构,如下所示

(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 ">")))])
(结构向量(x y z)
#:方法gen:自定义写入
[(定义(写入过程向量端口模式)
(let([打印(如果模式写入显示)])
(写入字符串“”)])
但是我在REPL中发现了一个奇怪的行为,其中结构被显示了3次:

> (define a (vector 1 2 3))
> a
<1, 2, 3><1, 2, 3><1, 2, 3>
>(定义一个(向量1、2、3))
>a

我一定是做错了什么,但找不到我的问题。有人能解释一下为什么我有3次输出吗?

将输出定向到输出端口,一切正常:

#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)))])
#朗球拍
(结构向量(x y z)
#:方法gen:自定义写入
[(定义(写入过程向量端口模式)
(let([打印(如果模式写入显示)])
(写入字符串“端口”)])

您需要使用
写入过程提供的
端口

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

谢谢,我没有注意文档:)哎呀,我看到@soegaard在我打字的时候发布了一个答案。我想我会把这个保留下来,作为
参数化
提示。
(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 ">"))))])