2015-09-02 34 views
7

,kaçının Ben aşağıda bir yapı tanımlamak olduğu bir yapı

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

Fakat yapı ekrana test 3 an nerede ben Repl bir garip davranış alıyorum:

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

Yanlış bir şey yapmalıyım ama sorunumu bulamadım. Birisi bana neden 3 kez çıktı aldığımı açıklayabilir mi?

cevap

6

Doğrudan çıkış portuna ve her şeyi çıkış çalışır: o olacaktır yapmak

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

Daha az-sıkıcı bir yol:

#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

Teşekkürler th dikkat etmiyordum e doc :) – mathk

5

Sen port verilen write-proc için kullanmanız gereken current-output-port değiştir:

(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

Oops, @soegaard benim yazarken bir cevap yazmıştı. Bunu 'parameterize' ucu için saklayacağım sanırım. –

İlgili konular