setq vs необъявленная свободная переменная (обычный lisp)

Я всего лишь Lisp n00b, поэтому, пожалуйста, будьте осторожны.

У меня проблемы с тем, чтобы обернуть голову идеей CL о [объявленной] свободной переменной. Я думаю, что:

(defun test ()
    (setq foo 17)
)

определил бы функцию, которая объявляет переменную foo и устанавливает ее на 17. Однако вместо этого я получаю

;Compiler warnings :
;  In TEST: Undeclared free variable FOO

Мой фактический пример немного больше; мой код (фрагмент) выглядит так:

(defun p8 ()
    ;;; [some other stuff, snip]

    (loop for x from 0 to (- (length str) str-len) do
        (setq last (+ x str-len))           ; get the last char of substring
        (setq subs (subseq str x last))     ; get the substring
        (setq prod (prod-string subs))      ; get the product of that substring
        (if (> prod max)                    ; if it's bigger than current max, save it
            (setq max prod)
            (setq max-str subs)
        )
    )

;;; [More stuff, snip]
)

и это дает мне:

;Compiler warnings for "/path/to/Lisp/projectEuler/p6-10.lisp":
;   In P8: Undeclared free variable LAST (2 references)
;Compiler warnings for "/Volumes/TwoBig/AllYourBits-Olie/WasOnDownBelowTheOcean/zIncoming/Lisp/projectEuler/p6-10.lisp" :
;   In P8: Undeclared free variable PROD (3 references)
;Compiler warnings for "/Volumes/TwoBig/AllYourBits-Olie/WasOnDownBelowTheOcean/zIncoming/Lisp/projectEuler/p6-10.lisp" :
;   In P8: Undeclared free variable SUBS (3 references)
;Compiler warnings for "/Volumes/TwoBig/AllYourBits-Olie/WasOnDownBelowTheOcean/zIncoming/Lisp/projectEuler/p6-10.lisp" :
;   In P8: Undeclared free variable =

Да, да, я понимаю, что я использую слишком много промежуточных переменных, но я пытаюсь понять, что происходит, прежде чем я слишком увлекся сжатием всего до минимальных типизированных символов, что кажется популярным в мире CL.

Так или иначе ... может кто-нибудь объяснить следующее:

При каких условиях Lisp «объявляет» переменную?Является ли область действия указанной переменной отличной от(...) вокругsetq заявление?! (То есть я ожидаю, что переменная будет действительна и доступна для всего:(... (setq ...) ...) 1 уровень за пределамиsetqнет?Я неправильно истолковываюНеобъявленная свободная переменная сообщение?Любые другие намеки, которые вы хотите дать, которые помогут мне лучше понять, что происходит здесь.

ПРИМЕЧАНИЕ: я достаточно опытен с C, Java, Javascript, Obj-C и родственными процедурными языками. Я понимаю, что функциональное программирование отличается. Сейчас я просто борюсь с синтаксисом.

Спасибо!

Постскриптум Если это имеет значение,defun p8 находится в текстовом файле (TextMate), и я запускаю его наClozure CL, Надеюсь, все это не имеет значения!

Ответы на вопрос(3)

Ваш ответ на вопрос