On Sat, Apr 25, 2009 at 5:12 PM, Michele Simionato
<[email protected]> wrote:
> On Sat, Apr 25, 2009 at 4:50 PM, Abdulaziz Ghuloum <[email protected]> wrote:
>> [PS. your definition of assert-distinct should use bound-identifier=?
>> instead of free-identifier=?, unless I misunderstood what it's used
>> for.  It is for checking duplicates in binding forms, like lambda, let
>> and letrec, right?]
>>
> The use case I had in mind was not a let form, but a multi-define form
> like this one:
>
> (def-syntax (multi-define (name1 name2 ...) (value1 value2 ...))
>  #'(begin (define name1 value1) (define name2 value2) ...))

Now I remember that I had even another use case in mind, i.e. an enumeration
macro, to be shown in future episodes:

$ cat enum.ss
(import (rnrs) (sweet-macros) (aps list-utils))

(def-syntax (enum name ...)
  (with-syntax (((i ...) (range (length #'(name ...)))))
  #'(syntax-match (name ...)
      (sub (ctx name) #'i) ...))
  (distinct? free-identifier=? #'(name ...))
  (syntax-violation 'enum "Duplicate name" #'(name ...)))

(def-syntax color (enum red green blue))

(display (list (color red) (color green) (color blue))); => (0 1 2)

;;(def-syntax color (enum red red blue)) ; raises a syntax-violation


Is free-identifier=? right in this use case?

Reply via email to