Как распечатать структуры в PLT Scheme, чтобы отобразить их поля? - PullRequest
4 голосов
/ 02 февраля 2010

Я хотел бы код, подобный этому:

(define-struct thing (a b c))
(define th (make-thing 1 2 3))

напечатать что-то вроде этого:

(make-thing 1 2 3)

когда я набираю "th" в ответ DrScheme или MzScheme. Я использую язык "довольно большой" в DrScheme со стилем вывода, установленным в "конструктор" Вот что я получаю в DrScheme:

(make-thing ...)

(я буквально получаю три точки)

В MzScheme:

#<thing>

1 Ответ

7 голосов
/ 02 февраля 2010

Есть несколько способов сделать это.Наиболее очевидным является использование:

(define-struct thing (a b c) #:transparent)

, что делает структуру доступной для проверки низкого уровня, которую выполняет распечатка.Другой альтернативой является использование вашего собственного принтера:

(define-struct thing (a b c)
  #:property prop:custom-write
  (lambda (thing port write?)
    (fprintf port (if write? "{~s,~s,~s}" "{~a,~a,~a}")
             (thing-a thing) (thing-b thing) (thing-c thing))))

Но обратите внимание, что стиль вывода «конструктор» пытается написать некоторые вещи по-другому.Также обратите внимание, что вы можете комбинировать оба этих параметра, чтобы у него был собственный писатель, а также он был прозрачным.(Обеспечение прозрачности в основном делает возможным для любого кода доступ к полям в экземпляре thing, например, equal? может копаться в нем.)

Наконец, для некоторых используется более подходящее средствозаключается в использовании структур "prefab":

(define-struct thing (a b c) #:prefab)

Как правило, каждый define-struct генерирует новый тип, даже если он уже был определен.Но с готовой структурой это как если бы существовал один тип, и вы просто привязываете некоторые функции (конструктор, предикат и методы доступа) для работы с этим уже существующим типом.

...