我想要这样的代码:
(define-struct thing (a b c))
(define th (make-thing 1 2 3))
打印这样的东西:
(make-thing 1 2 3)
当我在DrScheme或MzScheme repl中键入“th”时。我在DrScheme中使用“非常大”的语言,输出样式设置为“构造函数”。这就是我在DrScheme中得到的:
(make-thing ...)
(我真的得到三个点)
在MzScheme中:
#<thing>
答案 0 :(得分:7)
有几种方法可以做到这一点。最明显的一个是使用:
(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
生成一个新类型,即使已经定义了一个类型。但是使用预制结构就好像有一种类型预先存在,而你只是绑定一些函数(构造函数,谓词和访问器)来处理这种预先存在的类型。