> On May 2, 2016, at 11:50 AM, Sam Tobin-Hochstadt <sa...@cs.indiana.edu> wrote:
>> 
>> My initial statement was less precise than my second email.
>> `(syntax-local-introduce stx)` adds a single scope, using the
>> equivalent of `'flip` mode. That scope is "the current scope" for the
>> macro expansion step.

I appreciate your more detailed explanation. 

The common thread in the Knauth/Butterick critique is that 
`syntax-local-introduce` promises a result — syntax, locally introduced — but 
in fact delivers a certain action — adding a scope — that will only achieve the 
promised result if a certain other criterion is met (namely, a context-free 
syntax object). This is not apparent from the docs (though I will prepare a 
pull request to make it so).

Even with this clarification, some puzzling behavior awaits. For instance, you 
are correct that using `(datum->syntax #f 'x)` makes my two original examples 
work. But consider example #3 — where a subsequent local definition will shadow 
the `syntax-local-introduce` identifier, without an error — and example #4, 
which reverses the order of the two binding expressions, which then triggers an 
ambiguous-binding error.

;;;;

#lang racket
(require rackunit)

(module macros racket
  (provide (all-defined-out))
  (define-syntax (sli-x stx)
    (syntax-case stx ()
      [(_) (with-syntax ([x (syntax-local-introduce (datum->syntax #f 'x))])
             #'(define x 'syntax-local-introduce-x))]))
  
  (define-syntax-rule (invoke-x) x))

(require 'macros)

;; example 1
(check-equal?
 (let ()
   (sli-x)
   x) 'syntax-local-introduce-x)

;; example 2
(check-equal?
 (let ()
   (sli-x)
   (invoke-x)) 'syntax-local-introduce-x)

;; example 3: local definition shadows `syntax-local-introduce` but ...
(check-equal?
 (let ()
   (sli-x)
   (define x 'locally-defined)
   x) 'locally-defined)

;; example 4 ... if the two are reordered, you get an ambiguous-binding error
#;(check-equal?
 (let ()
   (define x 'locally-defined)
   (sli-x)
   x) 'locally-defined)


-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to