--- a/ac.scm 2010-02-20 12:15:04.000000000 -0500
+++ b/ac.scm 2010-02-20 12:39:20.000000000 -0500
@@ -397,8 +397,8 @@
(let ((b (ac b1 (ac-dbname! a env))))
(list 'let `((zz ,b))
(cond ((eqv? a 'nil) (err "Can't rebind nil"))
- ((eqv? a 't) (err "Can't rebind t"))
((lex? a env) `(set! ,a zz))
+ ((eqv? a 't) (err "Can't rebind t"))
(#t `(namespace-set-variable-value! ',(ac-global-name a)
zz)))
'zz))
Because using a local variable with the same name as a global variable doesn’t affect the global variable, it would do no harm to use t as a local variable if you wanted to:
(let t 3 (++ t) t)
However setting t is disallowed in arc3.1, even if the variable is local:
arc> (let t 3
(++ t)
t)
Can't rebind tThis hack allows t to be set when it’s a local variable:
arc> (let t 3
(++ t)
t)
4arc> t t
arc> (++ t)Can't rebind t
Why not do the same thing for nil?
Since nil is the empty list, this code:
(let nil 3 nil)
is the same as this list destructuring:
(let () 3 nil)
which assigns 3 to no variables, rather than making nil a local variable.
arc> (let nil 3 nil) nil
Besides, I use the global nil explicitly in my code a lot more than I use the global t explicitly, so it’s more useful to me to be able to use t as a local variable than it is to be able to use nil as one.
Same as Arc.