打印值,而不是类型(球拍)

时间:2016-01-25 07:48:51

标签: racket

当我在Racket中打印时,只打印结构类型,而不是值。 (我在DrRacket工作,在互动区。)

例如,我有一个树结构:

#lang racket
(define-struct node [name left right])

一个例子可能是:

(define SALLY (make-node 'sally BOBBY SUSIE))
(define BOBBY (make-node 'bobby NONE NONE))
(define SUSIE (make-node 'susie NONE NONE))

我所看到的:

> (print SALLY)
#<node>

我想看到的内容:

> (print SALLY)
(make-node 'sally (make-node 'bobby NONE NONE)
                  (make-node 'susie NONE NONE))

如何查看值而不是类型?

2 个答案:

答案 0 :(得分:7)

使用#:transparent keyword

(define-struct node [name left right] #:transparent)
> (define-struct node [name left right] #:transparent)
> (define NONE '())
> (define BOBBY (make-node 'bobby NONE NONE))
> (define SUSIE (make-node 'susie NONE NONE))
> (define SALLY (make-node 'sally BOBBY SUSIE))
> (print SALLY)
(node 'sally (node 'bobby '() '()) (node 'susie '() '()))

答案 1 :(得分:7)

注意:今天structdefine-struct更受欢迎,所以我用struct编写了代码。

它并不真正打印该类型,但它是对象的默认表示。您可以选择两种方法:

<强> 1。使用#:transparent关键字。

(struct node [name left right] #:transparent)
(define root (node 'd 
                   (node 'b (node 'a '() '()) 
                            (node 'c '() '())) 
                   (node 'f (node 'e '() '())
                            (node 'g '() '()))))
root ; ==>
     ; (node 'd 
     ;       (node 'b (node 'a '() '()) 
     ;                (node 'c '() '())) 
     ;       (node 'f (node 'e '() '())
     ;                (node 'g '() '()))))

注意它们看起来像是什么结构?

<强> 1。为对象添加编写器

(struct node [name left right]
  #:methods gen:custom-write
  [;; needs to be named write-proc
   (define (write-proc x port mode)
     ((if (eq? mode #t) write display) (fancy-writer x 0) port))

   ;; helper used by write-proc
   (define (fancy-writer x ident)
     (if (null? x)
         ""
         (let ([new-ident (+ 5 ident)])
           (string-append (fancy-writer (node-left x) new-ident)
                          (string-append (make-string ident #\space)
                                         (symbol->string (node-name x))
                                         "\n")
                          (fancy-writer (node-right x) new-ident)))))])

root ; ==>
     ;           a
     ;      b
     ;           c
     ; d
     ;           e
     ;      f
     ;           g