Found in a read/eval review: a local named like a special form wrongly took over operator position. (let [if (fn ...)] (if true 1 2)) returned the fn, but per spec section 3 (and the reference) special-form heads are not shadowable; only macros are. Two fixes: drop the (not shadowed) guard on the special-form branch of analyze-list (so an (if ...) head is always the special), and prefix a local whose name is a Scheme keyword when emitting (so a value local legally named if does not shadow the (if ...) the back end emits). Value-position locals named if/or/case still work. |
||
|---|---|---|
| .. | ||
| chez | ||
| conformance | ||