有几种方法可以做到这一点。最明显的一个是使用:
(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?
可以挖掘它。)
最后,对于某些用途,更合适的工具是使用“预制”结构:
(define-struct thing (a b c) #:prefab)
通常发生的情况是,每个都define-struct
生成一个新类型,即使已经定义了一个。但是对于预制结构,就好像存在一种预先存在的类型,而您只是绑定一些函数(构造函数、谓词和访问器)来使用这种预先存在的类型。