2015-09-02 16 views
7

muszę zdefiniować struct jak poniżej,unikać wyświetlania 3 raz struct

(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 jestem coraz dziwne zachowanie w REPL gdzie struktura jest bycie Wyświetlacz 3 Czas:

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

Muszę coś zrobić źle, ale nie mogę znaleźć mojego problemu. Czy ktoś może mi wyjaśnić, dlaczego mam 3-krotny wynik?

Odpowiedz

6

bezpośrednie wyjście do portu wyjściowego i wszystko działa:

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

Dzięki, że nie zwracałem uwagi na e doc :) – mathk

5

Musisz użyć port dostarczane 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)))]) 

A mniej żmudny sposób, aby to zrobić byłoby zmień 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

Ups, widzę, że @soegaard opublikował odpowiedź podczas pisania mojego. Utrzymam to dla pewnej końcówki "parametryzowania", jak sądzę. –

Powiązane problemy