如何在PLT Scheme中打印结构以显示其字段?

时间:2010-02-02 05:24:48

标签: data-structures scheme racket

我想要这样的代码:

(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>

1 个答案:

答案 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生成一个新类型,即使已经定义了一个类型。但是使用预制结构就好像有一种类型预先存在,而你只是绑定一些函数(构造函数,谓词和访问器)来处理这种预先存在的类型。