4

我想要这样的代码:

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

1 回答 1

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

于 2010-02-02T11:51:36.673 回答