[racket] Using ... in a syntax pattern destroys location information?

From: Carl Eastlund (cce at ccs.neu.edu)
Date: Wed Jun 29 15:28:30 EDT 2011

That looks like a bug in syntax snips.  Programmatically, I get the
results one would expect.

Here's my program (yours plus a few lines):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#lang racket
(define x (datum->syntax #f 'hello (list 'my-source 3 3 18 5)))
(define y (datum->syntax #f 'world (list 'my-source 3 9 24 5)))
(define a-bigger-syntax #`(module foo racket/base (#%module-begin #,x #,y)))
(define a-reconstructed-syntax
 (syntax-case a-bigger-syntax ()
  [(module name language (a-modbeg body ...))
   #'(module name language (a-modbeg body ...))]))

(displayln a-bigger-syntax)
(displayln a-reconstructed-syntax)

(require syntax/srcloc)
(define (walk-syntax stx . ns)
  (for/fold {[stx stx]} {[n (in-list ns)]}
    (list-ref (syntax->list stx) n)))

(define (get-x stx) (walk-syntax stx 3 1))
(define (get-y stx) (walk-syntax stx 3 2))

(define x1 (get-x a-bigger-syntax))
(define x2 (get-x a-reconstructed-syntax))
(define y1 (get-y a-bigger-syntax))
(define y2 (get-y a-reconstructed-syntax))

(for/list {[id (in-list (list x1 x2 y1 y2))]}
  (list (syntax-e id) (build-source-location id)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

And here's the output I get (after the two syntax snips):

(list
 (list 'hello (srcloc 'my-source 3 3 18 5))
 (list 'hello (srcloc 'my-source 3 3 18 5))
 (list 'world (srcloc 'my-source 3 9 24 5))
 (list 'world (srcloc 'my-source 3 9 24 5)))

So I have no idea why the snips are saying something else.

Carl Eastlund

On Wed, Jun 29, 2011 at 2:39 PM, Danny Yoo <dyoo at cs.wpi.edu> wrote:
>> Can you be more specific about what "funkiness" means?  That is, give
>> us a full program and its output that shows an expected and actual
>> source location that differ.  Right now there are a few things you
>> could be referring to.
>
>
> I think I was being mislead by what might be behavior from DrRacket's
> 5.1.1's printing of syntax objects.  When I introduce displaylns to
> let me explore the structure of the syntaxes, as in:
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> #lang racket
> (define x (datum->syntax #f 'hello (list 'my-source 3 3 18 5)))
> (define y (datum->syntax #f 'world (list 'my-source 3 9 24 5)))
> (define a-bigger-syntax #`(module foo racket/base (#%module-begin #,x #,y)))
> (define a-reconstructed-syntax
>  (syntax-case a-bigger-syntax ()
>   [(module name language (a-modbeg body ...))
>    #'(module name language (a-modbeg body ...))]))
>
> (displayln a-bigger-syntax)
> (displayln a-reconstructed-syntax)
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
> then under DrRacket's syntax printer, if I click on the 'hello
> identifier of the snip representation for a-bigger-syntax, I can
> observe that it's at position 18, line 3, column 3, and span 5.
> That's what I expect, because I built the syntax object that way.
>
> But if I click on the 'hello identifier of the a-reconstructed-syntax
> graphical snip, the snip reports itself as being at position 358, line
> 8, column 28, with a span of 19, which is not correct.  So something
> strange is happening here.
>
>



Posted on the users mailing list.