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?