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
, Надеюсь, все это не имеет значения!