mat*_*thk 7 scheme generic-interface racket
我已经定义了一个结构如下,
(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 ">")))])
Run Code Online (Sandbox Code Playgroud)
但是我在REPL中得到了一个奇怪的行为,其中结构显示3次:
> (define a (vector 1 2 3))
> a
<1, 2, 3><1, 2, 3><1, 2, 3>
Run Code Online (Sandbox Code Playgroud)
我一定是做错了,但找不到我的问题.有人可以告诉我为什么我有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)))])
Run Code Online (Sandbox Code Playgroud)
您需要使用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)))])
Run Code Online (Sandbox Code Playgroud)
一个不那么繁琐的方法是改变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 ">"))))])
Run Code Online (Sandbox Code Playgroud)