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.