DEFVAR устанавливает символ (здесь, X) как динамическую переменную («особая»). Как только это будет сделано, его динамичность будет сохранена с помощью LET и лямбда-списков (это одна из причин, почему вы всегда называете специальные переменные * earmuffs *). Таким образом, во втором примере X в TOTAL будет просматриваться в динамической среде, в которой вызывается TOTAL. Когда вы вызываете его на верхнем уровне, он видит привязку верхнего уровня X, где он имеет значение 10000. Вы также можете вызвать TOTAL внутри другого LET, который повторно связывает X, и он будет использовать это значение в течение продолжительности:
* (let ((x 1000))
(total 5)))
1005
* (total 1)
10002
В первом примере X не был отмечен как специальный, поэтому LET связывает его лексически, как обычно. Последующий DEFVAR не оказывает обратного влияния на TOTAL, потому что DEFUN захватил лексическую среду, созданную LET, и будет использовать ее для ссылки на X (в основном, скрывая ее от DEFVAR.)