Thanks for the tip!

I found the following to work pretty well :)

#lang racket
(require racket/match)
(require racket/struct)

(struct Var (name)
   #:methods gen:custom-write
  [(define (write-proc ast port mode)
     (match ast
       [(Var x)
        (write x port)]))])

(struct Num (value) 
   #:methods gen:custom-write
  [(define (write-proc ast port mode)
     (match ast
       [(Num n)
        (write n port)]))])

(struct Let (var rhs body)
  #:methods gen:custom-write
  [(define write-proc
     (make-constructor-style-printer
      (lambda (obj) 'let)
      (lambda (obj) (list (unquoted-printing-string "([")
                          (Let-var obj)
                          (Let-rhs obj)
                          (unquoted-printing-string "])\n")
                          (Let-body obj)))))])
                          
(define x (Var 'x))
(define y (Var 'y))
(define n (Num 42))
(define l (Let x n (Let y n x)))
(pretty-print l)

Produced the output:

(let ([ x 42 ])
 (let ([ y 42 ])
 x))


On Sunday, August 16, 2020 at 5:10:20 PM UTC-4 [email protected] wrote:

> I recommend using make-constructor-style-printer 
> <https://docs.racket-lang.org/reference/structutils.html#(def._((lib._racket%2Fstruct..rkt)._make-constructor-style-printer))>,
>  
> which automates a lot of the fiddly indentation-handling you'd have to do 
> otherwise.
> On Sunday, August 16, 2020 at 1:48:50 PM UTC-7 [email protected] wrote:
>
>>
>> Hi All,
>>
>> I'm looking into using Racket structs to represent abstract syntax trees.
>> I've gotten as far as defining gen:custom-write properties, but have not
>> yet figured out how to control indenting. Also, I'm not sure I'm just 
>> calling
>> write-string, write, and newline in my gen:custom-write methods, which I
>> suspect is not exactly correct.
>>
>> Are there some good up-to-date examples of this that I could look at?
>>
>> Thanks,
>> Jeremy
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/0bf543ed-3587-4fed-a527-49ebad106eafn%40googlegroups.com.

Reply via email to