避免显示结构体三次。

7

I have define a struct as below,

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

我肯定做错了什么,但是找不到我的问题所在。有人能告诉我为什么会输出三次吗?

2个回答

6

将输出直接指向输出端口即可,一切正常:

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

谢谢,我没有注意到文档 :) - mathk

5
您需要使用提供给write-procport
(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 ">"))))])

1
哎呀,我看到@soegaard在我打字的时候已经发布了一个答案。我想我会保留这个parameterize提示。 - Greg Hendershott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接