2016-04-11 17 views
1

Ich habe versucht, durch verwandte Fragen zu suchen, aber ich konnte keine einfache Antwort finden, wie ich meine Variablen in Common LISP definieren sollte. Ich verwende die sbcl Implementierung und ich habe Tutorials wurden mit mir zu helfen, die Sprache zu lernen, aber aus irgendeinem Grund dieser Code:Ich kann Setq nicht in sbcl [LISP] verwenden

;;print a line many times 
(setq xx 1) 
(while (< xx 20) 
    (message "yay") 
    (setq xx (1+ xx)) 
) 

Gibt einen Fehler zurück: Die Variable XX ungebunden ist. Ich bekomme auch Stil-Warnungen für die Zeit und die Nachricht. Könnte mir jemand in die richtige Richtung zeigen, was das Problem mit diesem Code ist?

+2

Gemeinsame Lisp. XX ist undefiniert. Du hast es nicht definiert. Vielleicht möchten Sie es definieren. WHILE existiert nicht. Siehe LOOP. NACHRICHT existiert auch nicht. Sieht nicht wie Common Lisp aus. Vielleicht sollten Sie zuerst eine Sprachreferenz überprüfen. Sie sind auch eingebaute Tools wie APROPOS und DOKUMENTATION, die helfen sollten. –

+2

** "Ich habe Tutorials verwendet, um mir beim Erlernen der Sprache zu helfen, aber aus irgendeinem Grund könnte dieser Code" ** einen Link zu diesem Tutorial bereitstellen? ** while ** ist kein Looping-Makro in Common Lisp (obwohl Sie leicht eins definieren könnten), also ist entweder das Tutorial nicht sehr gut, es ist kein gewöhnliches Lispeln, oder dieser Code wurde in einem Kontext zur Verfügung gestellt wurde nicht vollständig reproduziert. –

+1

Ich würde [dies] (http://www.gigamonkeys.com/book/) über jedes Web-Tutorial empfehlen. – molbdnilo

Antwort

0

Gut, das Tutorial scheint nicht Common Lisp, so scheint es Lisp mehr Emacs, diese Funktionen Emacs und

ielm Befehl
*** Welcome to IELM *** Type (describe-mode) for help. 
ELISP> ;print a line many times 
(setq xx 1) 
(while (< xx 20) 
    (message "yay") 
    (setq xx (1+ xx)) 
) 
*** IELM error *** More than one sexp in input 
ELISP> (setq xx 1) 
1 (#o1, #x1, ?\C-a) 
ELISP> (while (< xx 20) 
    (message "yay") 
    (setq xx (1+ xx))) 
nil 
ELISP> (message "yay") 
"yay" 
ELISP> (while (> xx 20) 
    (message "yay") 
    (setq xx (1+ xx))) 
nil 
ELISP> xx 
20 (#o24, #x14, ?\C-t) 
ELISP> 

So verwenden auszuführen dies einer der vielen Gründe dafür ist, dass dieser Code nicht Arbeit, wenn Sie es in der SBCL REPL ausführen, wird es viele Fehler unbekannte Funktion, ungebundene Variablen, ...

wie die Kommentare zeigen, nehmen Sie eine gute Lisp-Tutorial oder ein Buch, empfehle ich ANSI Common Lisp von Paul Graham aber Wenn du Spaß am Land von Lisp aus Conrad barski magst, ist dein Buch, und für deinen Code in Lisp könnte etwas wie das sein:

CL-USER> (dotimes (xx 20 xx) (print "yay")) 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
20 

Sie müssen lernen, wie Variablen, setq vs defparameter, spezielle Variablen ... Schleifen zu definieren, eine Menge, was ich beginnen vor Lisp Jahren lernen, eine denke ich, dass eine erstaunliche Reise

1

ist Wenn der Fragetitel und/oder die ungebundene Compilerbeschwerde ist, warum Sie hier gelandet sind, ist es wahrscheinlich, dass die Antwort, an der Sie interessiert sind, am unteren Ende der Antwort von anquegi begraben liegt: Verwenden Sie defvar oder defparameter oder let. Die ersten beiden werden normalerweise als Formulare der obersten Ebene verwendet. Im Gegensatz dazu wird let verwendet, um "temporäre" benannte Variablen innerhalb eines begrenzten Umfangs zu erstellen.

Sie können auch Difference between `set`, `setq`, and `setf` in Common Lisp? hilfreich finden.