I am `gen:custom-write` and `make-constructor-style-printer` on an object graph that may contain cycles. Within my custom write procedure, I use `parameterize` to register an object into dictionary and later in the writing process I can check that dictionary, detect the cycle, and do more custom write logic.
But I have noticed that sometimes that my `parameterize` has gone out of scope by the time the printer gets deeper into the object graph. I was able to work around this issue by using another port, then copying the result to the real port like this: (define-syntax-rule (write-now proc x port mode) (let* ([alt-port (open-output-string)] [_ (proc x alt-port mode)] [str (get-output-string alt-port)]) (write-string str port))) This is better than just doing `(proc x port mode)` because it always prints the string that I expect. However, it breaks pretty printing. I've noticed that the built-in pretty printing logic will sometimes hit the same leaf object multiple times, as if it is testing to see how wide the result is and backing up and trying again. Perhaps it can also delay evaluation? That would explain why my `parameterize` has ended. Is there a way to use `parameterize` within custom write logic and keep pretty printing working? Is there a better approach I should take? Additional Information === https://github.com/default-kramer/morsel/blob/master/morsel-lib/private/essence/base-query-printer.rkt#L22 The `write-now` macro, as written, is "correct but unpretty". I can change it to "incorrect but pretty" as follows: (define-syntax-rule (write-now proc x port mode) (proc x port mode)) https://github.com/default-kramer/morsel/blob/master/morsel-lib/private/essence/from.rkt#L373 This is a test that fails in "incorrect but pretty" mode. Rackunit reports: location: from.rkt:373:2 actual: "(from #0=a/0 \"A\" (attach #1=b/1 \"B\" (attach #2=c/2 \"C\") #3=(list #0# #1# #2#)))" expected: "(from a/0 \"A\" (attach b/1 \"B\" (attach c/2 \"C\") (list a/0 b/1 c/2)))" Here are two screenshots, one pretty and one unpretty: [image: pretty.png] [image: unpretty.png] -- 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 racket-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/6369f1c7-a8a5-470e-af9f-ce1c133469ca%40googlegroups.com.