【问题标题】:Avoid displaying 3 time a struct避免显示 3 次结构
【发布时间】:2015-11-28 02:49:02
【问题描述】:

我已经定义了一个结构如下,

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

我一定是做错了什么,但找不到我的问题。有人能解释一下为什么我的输出是 3 倍吗?

【问题讨论】:

    标签: scheme racket generic-interface


    【解决方案1】:

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

    【讨论】:

    • 糟糕,我看到@soegaard 在我输入我的答案时发布了答案。我想我会留着这个给parameterize 小费。
    【解决方案2】:

    将输出定向到输出端口,一切正常:

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

    【讨论】:

    • 谢谢我没有关注文档 :)
    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多