setq vs Nicht deklarierte freie Variable (Common Lisp)

Ich bin ein totaler Lisp n00b, sei also bitte sanftmütig.

Ich habe Probleme damit, CLs Idee einer [nicht] deklarierten freien Variablen in den Kopf zu bekommen. Ich würde das denken:

(defun test ()
    (setq foo 17)
)

würde eine Funktion definieren, die eine Variable foo deklariert und auf 17 setzt. Stattdessen erhalte ich jedoch

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

Mein tatsächlicher Beispielfall ist etwas größer. Mein Code (Snippet) sieht folgendermaßen aus:

(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]
)

und das gibt mir:

;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 =

Ja, ja, mir ist klar, dass ich viel zu viele Zwischenvariablen verwende, aber ich versuche zu verstehen, was vor sich geht, bevor ich mir zu viel Mühe mache, alles auf die minimal eingetippten Zeichen zu komprimieren, wie es in der CL-Welt beliebt erscheint.

Also, auf jeden Fall ... kann jemand folgendes erklären:

Unter welchen Bedingungen deklariert Lisp eine Variable?Ist der Gültigkeitsbereich der Variablen anders als die umschließende(...) um diesetq Aussage?! (Das heißt, ich würde erwarten, dass die Variable für alles von gültig und gültig ist(... (setq ...) ...) die parens 1 ebene außerhalb dersetq, Nein?Verstehe ich das falsch?Nicht deklarierte freie Variable Botschaft?Alle anderen Hinweise, die Sie mir geben möchten, helfen mir, besser zu verstehen, was hier vor sich geht.

HINWEIS: Ich bin ziemlich erfahren in C, Java, Javascript, Obj-C und verwandten Verfahrenssprachen. Ich verstehe, dass die funktionale Programmierung anders ist. Im Moment ringe ich nur mit der Syntax.

Vielen Dank!

P.S. Wenn es darauf ankommt,defun p8 ist in einer Textdatei (TextMate) und ich laufe es aufClozure CL. Hoffentlich ist das alles egal!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage