2016-09-20 3 views
2

Есть ли способ контролировать, как печатается структура?Как печатать структуры Racket

Например, если у меня есть прозрачная структура, содержащая изображение:

(struct photo (label image-data) #:transparent) 

Но я не хочу, чтобы напечатать image-data поле.

ответ

4

Я хочу немного расширить ответ Бена. Вы также можете комбинировать 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") 

Теперь write, display и print все работы, как вы ожидали бы

3

Да! Используйте общий интерфейс 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>" 

Первый аргумент write-proc является структура для печати. Второй аргумент - порт для печати. Третий аргумент показывает, как контекст хочет напечатать значение, см. Документы: http://docs.racket-lang.org/reference/Printer_Extension.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._gen~3acustom-write%29%29