如何打印球拍结构

Ben*_*man 4 racket

有没有办法控制结构的打印方式?

例如,如果我有一个包含图像的透明结构:

(struct photo (label image-data) #:transparent)
Run Code Online (Sandbox Code Playgroud)

但我不想打印这个image-data领域.

Lei*_*sen 6

我想延长Ben的答案.您还可以结合gen:custom-write使用make-constructor-style-printer,使结构打印更加容易.此功能可以为您处理打印,写入,报价深度和输出端口之间的差异.

扩展他的例子给出:

#lang racket
(require pict
         racket/struct)

(struct photo (label image-data)
  #:transparent
  #:methods gen:custom-write
  [(define write-proc
     (make-constructor-style-printer
       (lambda (obj) 'photo)
       (lambda (obj) (list (photo-label obj)))))])

(displayln (photo "fish" (standard-fish 100 100)))
;; Prints #<photo: fish>

(println (photo "fish" (standard-fish 100 100)))
;; Prints (photo "fish")
Run Code Online (Sandbox Code Playgroud)

现在write,displayprint所有的工作,你会期望


Ben*_*man 5

是! 使用gen:custom-write通用接口。

#lang racket
(require pict)

(struct photo (label image-data)
  #:transparent
  #:methods gen:custom-write
  [(define (write-proc photo-val output-port output-mode)
     (fprintf output-port "#<photo:~a>" (photo-label photo-val)))])

(photo "fish" (standard-fish 100 100))
;; Prints "#<photo:fish>"
Run Code Online (Sandbox Code Playgroud)

第一个参数write-proc是要打印的结构。第二个参数是要打印到的端口。第三个参数建议上下文如何打印值,请参见docs:http : //docs.racket-lang.org/reference/Printer_Extension.html#%28def._%28%28lib._racket%2Fprivate%2Fbase。 rkt%29._gen〜3acustom-write%29%29