Anyway, here's a real life example of why hygiene matters. Consider the following code:
(define (vector-n-smallest vector n <) (let* ((store (vector-copy vector 0 (+ n 1)))) (insert-sort! store <) (do-range (i (+ n 1) (vector-length vector)) (vector-set! store n (vector-ref vector i)) (insert-sort! store <)) (vector-copy store 0 n)))Hmm, my custom comparison function keeps complaining it's being fed integers rather than frobs! What's going on?
Turns out that I had defined do-range without macro hygiene, and it's expansion involves the symbol <. It's not rocket science, but it is a good example of why you should care about hygiene. (Note that this problem is "solved" in Common Lisp---I think---because the passed in comparison function lives in the value of the symbol <, while the CL::< numerical comparison lives in the symbol-function of the symbol <, so you have to use a funcall to get the custom comparison while (< ...) does the usual CL thing. Hygiene, on the other hand, just does the right thing.)