Есть несколько способов сделать это.Наиболее очевидным является использование:
(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
генерирует новый тип, даже если он уже был определен.Но с готовой структурой это как если бы существовал один тип, и вы просто привязываете некоторые функции (конструктор, предикат и методы доступа) для работы с этим уже существующим типом.