2015-09-02 1 views
7

I wie unten eine Struktur definieren,Vermeiden Sie die Anzeige 3 Mal, wenn ein 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 ">")))]) 

Aber ich bin ein seltsames Verhalten in der REPL bekommen, wo die Struktur Anzeige 3 Mal wird:

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

Ich muss etwas falsch machen, aber ich kann mein Problem nicht finden. Kann mir jemand erklären warum ich 3 mal die Ausgabe habe?

Antwort

6

Direkt der Ausgang an den Ausgangsport und alles funktioniert:

#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

Dank ich habe nicht auf th aufgepasst e doc :) – mathk

5

Sie müssen die port versorgt write-proc verwenden:

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

eine weniger mühsame Art und Weise zu, dass sein zu tun würde ändern 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

Hoppla, ich sehe @soegaard hat eine Antwort gepostet, während ich meins getippt habe. Ich behalte das für den 'parameterize'-Tipp, denke ich. –