>> On Apr 25, 2016, at 3:43 PM, Matthew Butterick <[email protected]> wrote:

>> ;;;;;;;;;;;;;;
>> #lang racket
>> 
>> (define-syntax-rule (binding-form _topid (_id ...))
>> (define (_topid)
>>     (let ([_id '_id] ...)
>>     (displayln (format "~a bound ~a" '_topid _id)) ...)))
>> 
>> (binding-form foo (a b c))
>> (foo) ; works 
>> 
>> (define-syntax-rule (id-maker _a "," _b "," _c)
>> (_a _b _c))
>> 
>> (binding-form bar (id-maker a ZIM b ZAM c))
>> (bar) ; fails, will treat `(id-maker ..)` expr as list of literal ids

Actually, no need for match expanders or generic bind (it wasn't a binding 
position anyway), this works:

#lang racket

(require syntax/parse/define)

(define-syntax-parser binding-form
  [(binding-form _topid id-stuff)
   #:with [_id ...] (local-expand #'id-stuff 'expression #f)
   #'(define (_topid)
       (let ([_id '_id] ...)
         (displayln (format "~a bound ~a" '_topid _id)) ...
         (void)))])

(binding-form foo (a b c))
(foo) ; works, prints foo found a, etc.

;; this has to be define-simple-macro, not define-syntax-rule
(define-simple-macro (id-maker _a "," _b "," _c)
 (_a _b _c))

(binding-form bar (id-maker x "," y "," z))
(bar) ; works, prints bar found x, etc.

Actually I'm surprised that this worked; I expected it to be much more 
difficult. Does this allow you to do what you want?

Alex Knauth

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

Reply via email to