Ich habe vor ein paar Tagen angefangen, Common Lisp zu lernen, und ich versuche eine Funktion zu erstellen, die eine Zahl in einen Baum einfügt. Ich erhalte einen Fehler,
*** - SYSTEM ::% EXPAND-FORM: (CONS NIL LST) sollte ein Lambda-Ausdruck sein
Wenn man herumgehört, sieht es so aus, als wenn man zu viele Klammern hat, aber nachdem ich eine Stunde lang herumgeschaut habe und Dinge geändert habe, kann ich nicht herausfinden, wo ich das machen könnte / p>
Dies ist der Code, wo es passiert:
%Vor%Ich bin mir ziemlich sicher, dass es nach dem ((gleich (länge)) 2 auftritt, wo die Idee darin besteht, eine leere Liste in die bestehende Liste einzufügen, dann eine leere Liste an das Ende anzufügen und dann eine leere Liste einzufügen in die Mitte.
Richtig! Das Problem ist in der Zeile direkt danach, wo es heißt
%Vor% Das Problem sind die zwei öffnenden Klammern. Klammern können die Bedeutung in speziellen Kontexten ändern (wie die von Ihnen verwendete cond
-Form), aber in diesem Zusammenhang bedeuten die Klammern die normale Funktionsanwendung, genau wie Sie es wahrscheinlich gewohnt sind. Das bedeutet, dass die erste Sache nach den Klammern eine Funktion sein muss. Aus der Perspektive der äußeren Klammern ist die erste Sache (cons nil lst)
, also muss es eine Funktion sein (was nicht der Fall ist).
Beachten Sie, dass Sie die Klammern nicht einfach entfernen können, da die Funktion cons
eine neue Liste wie gewünscht zurückgibt, aber die alte Liste nicht ändert. Sie wollen wahrscheinlich so etwas:
Wenn Sie die Funktion korrekt einrücken, können Sie sehen, dass vor CONS NIL LST eine zusätzliche Klammer steht.
%Vor%In den meisten Lisp-IDEs können Sie Ausdrücke einrücken. Wählen Sie in LispWorks den gesamten Ausdruck und machen Sie m-x Indent-Region.
Um den unmittelbaren Fehler zu beheben, können Sie einfach vorher ein PROGN hinzufügen (CONS NIL ...). PROGN arbeitet, indem es jede Form darin auswertet und den Wert der letzten Form als Wert zurückgibt.
Aber Ihr Programm wird immer noch nicht tun, was Sie denken, dass es tun wird (ich denke schon). Sie wissen, in Common Lisp verwenden Sie das erste Cons-Objekt, um die ganze nicht leere Liste darzustellen, und Sie können nicht einfach die Head Cons ersetzen. Der bessere Weg ist, die neue Liste als Wert der Funktion zurückzugeben.
%Vor% Vielleicht möchten Sie (setf lst (insert lst [some-number]))
, wenn Sie diese Funktion verwenden.
Sie haben Recht; an der mit "error is here" gekennzeichneten Zeile liegt ein Syntaxfehler vor:
%Vor% Für den Compiler / Interpreter liest das Formular als Funktionsaufruf die Funktion (cons nil list)
, die überhaupt keine Funktion ist. Der Compiler beklagt sich hier über die Verwendung einer zusammengesetzten Form in der Position "operator", die keine lambda
ist (die einzige Art von Verbindungsform, die in dieser Position akzeptiert wird.)
Ich würde helfen, den Ausdruck neu zu formulieren, aber ich bin mir nicht sicher, was Sie hier erreichen wollen.
Tags und Links lisp common-lisp syntax-error