Allgemeiner Lisp-Fehler: "sollte Lambda-Ausdruck sein"

8

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.

    
Zachary Wright 04.04.2010, 20:44
quelle

4 Antworten

6

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:

%Vor%     
Noah Lavine 04.04.2010, 20:55
quelle
7

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.

    
Rainer Joswig 04.04.2010 21:03
quelle
2

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.

    
Charles Lew 28.03.2013 11:05
quelle
1

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.)

%Vor%

Ich würde helfen, den Ausdruck neu zu formulieren, aber ich bin mir nicht sicher, was Sie hier erreichen wollen.

    
Dirk 04.04.2010 20:55
quelle

Tags und Links