Maxima использует только динамическую область видимости, а не лексическую область видимости. Переменные Maxima реализованы в виде символов Lisp, которые объявлены специальными. Для того, чтобы J был виден для Maxima, он должен быть объявлен специальным так или иначе (либо через DEFVAR / DEFPARAMETER, либо (DECLARE (SPECIAL ...)), я забыл, если есть другие способы).
Я знаю, что это неудовлетворительно, поскольку динамическая область позволяет создавать конфликты имен и, следовательно, скрытые ошибки. Может быть, вы можете убедиться, что нет конфликтов имен, используя gensym; может быть, написать макрос для замены gensym на другую переменную и объявить gensym специальным, что-то вроде этого.