[racket] scribble defproc formatting question
Some more info...
I see that I am indeed stomping on the syntax location info for the
"(or/c soundex-ordinal? #f)" syntax object, which I assume is a factor
in it being formatted badly. I still have questions.
First, I made a procedure to do a detailed dump of the syntax object:
(define (debug-dump-syntax-object stx-or-pair)
(cond ((pair? stx-or-pair)
`(*NONSYNTAX-PAIR* ,(debug-dump-syntax-object (car stx-or-pair))
,(debug-dump-syntax-object (cdr stx-or-pair))))
((null? stx-or-pair)
`(*NONSYNTAX-NULL*))
(else
`(*SYNTAX* :SRC ,(syntax-source stx-or-pair)
:L ,(syntax-line stx-or-pair)
:C ,(syntax-column stx-or-pair)
:P ,(syntax-position stx-or-pair)
:S ,(syntax-span stx-or-pair)
:O ,(syntax-original? stx-or-pair)
,(let ((stx-e (syntax-e stx-or-pair)))
(cond ((pair? stx-e)
`(*SYNTAX-PAIR*
,(debug-dump-syntax-object (car stx-e))
,(debug-dump-syntax-object (cdr stx-e))))
((null? stx-e)
`(*SYNTAX-NULL*))
(else `(*ATOMIC* ,stx-e))))))))
So, the generated syntax object that looks pretty-printed like this:
(doc scribble (defproc (soundex-ordinal (chr char?))
(or/c soundex-ordinal? #f)
"Yields the Soundex ordinal value of character "
(racket chr)
"!!!"))
...has a debugging dump like this:
(*SYNTAX* :SRC "myfile" :L 56 :C 0 :P 2065 :S 648 :O #f
(*SYNTAX-PAIR* (*SYNTAX* :SRC "myfile" :L 56 :C 1 :P 2066 :S
3 :O #t
(*ATOMIC* doc))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC #f :L #f :C #f :P #f :S 0 :O #f
(*ATOMIC* scribble))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC #f :L #f :C #f :P #f :S 0 :O #f
(*SYNTAX-PAIR*
(*SYNTAX* :SRC #f :L #f :C #f :P
#f :S 0 :O #f
(*ATOMIC* defproc))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC #f :L #f :C #f :P
#f :S 0 :O #f
(*SYNTAX-PAIR*
(*SYNTAX* :SRC
"myfile" :L 75 :C 9 :P 2798 :S 15 :O #t
(*ATOMIC*
soundex-ordinal))
(*SYNTAX* :SRC #f :L
#f :C #f :P #f :S 0 :O #f
(*SYNTAX-PAIR*
(*SYNTAX*
:SRC #f :L #f :C #f :P #f :S 0 :O #f
(*SYNTAX-PAIR*
(*SYNTAX* :SRC "myfile" :L 75 :C 25 :P 2814 :S 3 :O #t
(*ATOMIC* chr))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC "myfile" :L 74 :C 39 :P 2753 :S 5 :O #t
(*ATOMIC* char?))
(*NONSYNTAX-NULL*))))
(*NONSYNTAX-NULL*)))))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC #f :L #f :C #f
:P #f :S 0 :O #f
(*SYNTAX-PAIR*
(*SYNTAX* :SRC
"myfile" :L 74 :C 46 :P 2760 :S 4 :O #t
(*ATOMIC*
or/c))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC
"myfile" :L 74 :C 51 :P 2765 :S 16 :O #t
(*ATOMIC*
soundex-ordinal?))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC
"myfile" :L 74 :C 68 :P 2782 :S 2 :O #t
(*ATOMIC* #f))
(*NONSYNTAX-NULL*)))))
(*SYNTAX* :SRC #f :L #f :C #f
:P #f :S 0 :O #f
(*SYNTAX-PAIR*
(*SYNTAX* :SRC
"myfile" :L 57 :C 5 :P 2101 :S 48 :O #t
(*ATOMIC*
"Yields the Soundex ordinal value of character "))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC
"myfile" :L 58 :C 5 :P 2155 :S 12 :O #t
(*SYNTAX-PAIR*
(*SYNTAX* :SRC "myfile" :L 58 :C 6 :P 2156 :S 6 :O #t
(*ATOMIC* racket))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC "myfile" :L 58 :C 13 :P 2163 :S 3 :O #t
(*ATOMIC* chr))
(*NONSYNTAX-NULL*))))
(*NONSYNTAX-PAIR*
(*SYNTAX* :SRC
"myfile" :L 59 :C 5 :P 2173 :S 5 :O #t
(*ATOMIC* "!!!"))
(*NONSYNTAX-NULL*)))))))))
(*NONSYNTAX-NULL*)))))
If you search for "or/c" in the debug dump, you can see that its parent
"(*SYNTAX* (*SYNTAX-PAIR* ...))" has nulled/zero location info, whereas
"or/c" syntax object has valid info. This is presumably my fault and
fixable, since I see no reason to replace the location info in this
case. But even if I fix this one, I suspect I will have similar
situations in the code that cannot be fixed, and that I imagine might
mess up formatting similarly.
Also, I have both "*SYNTAX-PAIR*" and "*NONSYNTAX-PAIR*" in the dump. I
can change all the latter kind to the former kind easily enough, if that
actually matters.
Or perhaps I'm smoking crack, and Scribble is not as sensitive to source
positions as it seems to me at the moment.
Neil Van Dyke wrote at 05/01/2012 01:51 AM:
> Can someone who knows Scribble internals point me in the right
> direction on this?
>
> I have a generated "defproc" syntax object that gets formatted badly
> by Scribble, as shown in screenshot: http://i.imgur.com/FmdQr.png
>
> The "defproc" syntax object is generated in this case by piecing
> together information from three syntax objects read from a source file:
>
> (doc procedure soundex-ordinal
> "Yields the Soundex ordinal value of character "
> (racket chr)
> [...])
>
> (provide/contract (soundex-ordinal (-> char? (or/c soundex-ordinal?
> #f))))
>
> (define (soundex-ordinal chr)
> [...])
>
> Note that the other "defproc" in the screenshot is formatted fine.
> That "defproc" result of that one is an identifier, rather than a
> parenthesized form.
>
> The "syntax->datum" looks fine, and formats correctly if pasted into a
> file and processed from there:
>
> @(defproc (soundex-ordinal (chr char?))
> (or/c soundex-ordinal? #f)
> "Yields the Soundex ordinal value of character "
> (racket chr)
> [...])
>
> I'm wondering whether the problem is the combinations of syntax
> location info in the generated "defproc" syntax object. I try to
> preserve the location info of the individual pieces, and often use
> "quasisyntax/loc". Also, the "(or/c soundex-ordinal? #f)" syntax
> object should be intact just as read originally, including its
> parentheses.
>
> Neil V.
>