Andreas Schwab writes: >> diff --git a/src/eval.c b/src/eval.c >> index 4559a0e1f6..9a3f703f40 100644 >> --- a/src/eval.c >> +++ b/src/eval.c >> @@ -972,8 +972,11 @@ DEFUN ("let", Flet, Slet, 1, UNEVALLED, 0, >> if (!NILP (lexenv) && SYMBOLP (var) >> && !XSYMBOL (var)->u.s.declared_special >> && NILP (Fmemq (var, Vinternal_interpreter_environment))) >> - /* Lexically bind VAR by adding it to the lexenv alist. */ >> - lexenv = Fcons (Fcons (var, tem), lexenv); >> + if (XSYMBOL (var)->u.s.trapped_write == SYMBOL_NOWRITE) > > I think that should use the same condition as set_internal, so that (let > ((:k :k))) still works. Thanks, I forgot about that case. I changed the code to just defer to the dynamic version for keywords and added a test. Seems to be working, and is even simpler than what I had before. Best regards, Stefan Kangas