In this thread on the PLT discussion list, the original poster was encountering a problem while implementing a DSL where definitions were getting defined more than once in the code that he was generating. The problem is that the define function will not define the same name twice:
(define x 10)
(define x 12)
=> duplicate definition for identifier in: x
The solution would be to check if the given name is already bound before defining: if it was not defined, the define function should be used, otherwise the set! function should be used:
(define x 10)
(set! x 12)
Here is Andre’s solution from the thread:
(define-syntax define-if-not
(λ (stx)
(syntax-case stx ()
[(_ var val)
(with-syntax ([set!define (if (identifier-binding #'var 0)
#'set!
#'define)])
(syntax
(set!define var val)))])))
identifier-binding returns true unless the name is a top level binding or is not bound at all. If the name is already bound, use set!; otherwise use define.