2010-02-02 41 views
4

我想这样的代码:如何在PLT方案中打印结构以显示其字段?

(define-struct thing (a b c)) 
(define th (make-thing 1 2 3)) 

打印是这样的:

(make-thing 1 2 3) 

当我输入 “日” 到无论是DrScheme或MzScheme的REPL。我在DrScheme中使用语言“很大”,输出样式设置为“构造函数”。这是我在DrScheme得到:

(make-thing ...) 

(我硬是拿到3点)

在使用MzScheme:

#<thing> 

回答

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