I like Racket's way of handling them, to a degree. Each of {}, [], and () are interchangeable, and the use of [] is mostly down to convention. For example, it is often used in let bindings:
(define x
(let ([a 1]
[b 2])
(+ a b)))
By to a degree, I would actually prefer if the convention was enforced.