2016-05-12 4 views
0

Hey Leute, ich brauche Hilfe mit Lisp-Funktion. Ich soll erstellen:lisp letzte Element funktionale Form

(myLast L) Evaluiert das letzte Element der Liste L. eg. (MyLast ‚(paeg)) → g

kann ich nicht alle vordefinierten Formulare für Lisp verwenden nur die, die wir haben in der Klasse gegeben worden:

(atom X) 
(quote X) 
‘X 
(eq X Y) 
(cons X L) 
(car L) 
(cdr L) 
(list A B C) 
(if X Y Z)  
(cond (C1 S1) (C2 S2) …… (Cn Sn))  

Ich dachte, ich hatte recht, wenn ich legte in :

(defun myLast (L) 
    (if ((eq L '()) (cdr L)) 
     (car L) 
     (myLast (cdr L)))) 

jedoch einen Fehler ich erhalte:

Error: The variable MYHW4.LISP is unbound. 
Error signalled by EVAL 
Backtrace: EVAL 
Broken at SYSTEM::GCL-TOP-LEVEL. 

ich LISP völlig neu bin und zu versuchen, complet e diese Aufgabe. Ich hatte gehofft, ihr könnt mir helfen und mich wissen lassen, warum ich diesen Fehler bekomme, und ist meine Logik für die letzte funktionale Form korrekt? Vielen Dank!

Antwort

1

Es gibt mehrere Probleme mit Ihrem Code.

Sie haben überschüssige Klammern. ((eq L '()) ist nicht zulässig, da der einzige an der Bedienerposition zulässige Ausdruck eine anonyme Funktion ist.

Ihre if haben nur eine Konsequenz Ausdruck, aber keine Alternative. Es ist nicht der letzte Ausdruck, also ist es ein toter Code.

Das tun Sie car, auch nicht in der realen Position so weit Code auch.

Tail-Ausdruck ist die Rekursion und wird bedingungslos ausgeführt. Es heißt unendliche Rekursion.

Ich denke, vielleicht Sie so etwas wie dies bedeuten:

(defun myLast (list) 
    (if (null (cdr list)) 
     (car list) 
     (myLast (cdr list)))) 
+0

Oh, ich sehe jetzt danke! – John

1

Die Fehlermeldung bezieht sich nicht auf Ihren Code. Sie haben wahrscheinlich (load myhw4.lisp) ohne Anführungszeichen getippt. In diesem Fall denkt Ihr Lisp zu Recht, dass Sie den an die Variable myhw4.lisp gebundenen Wert annehmen möchten, die nicht existiert. Sie müssen Strings "like so" angeben.

Auch ((eq L '()) ...) ist problematisch, da die erste Form (eq ...) ist, die keine Funktion oder ein Lambda ist. Das wird einen Fehler signalisieren.

Das obige macht Ihren Code falsch, aber Sie sind nicht weit davon entfernt.

+0

Vielen Dank für die Antwort. Ich habe herausgefunden, was ich falsch gemacht habe, als ich versucht habe, es zu laden. – John

+0

(defun myLast (L) (if (Lambda (eq L ‚()) (cdr L)) (Auto L) (myLast (cdr L)))) Dies ist, was ich geändert habe es aber etwas ist aus Ich bekomme den ersten Punkt der Liste anstelle des letzten. Irgendwelche Vorschläge? – John

+0

Oder einfach '(if (eq (cdr L)()) (Auto L) (mein-last (cdr L)))'. Ich bin überrascht, dass Ihr Lisp die Argumentliste Ihres 'Lambda' nicht abgelehnt hat. Plus, wenn Sie nur testen (wenn (Lambda ...) x y), dann ist der Test immer T, da eine anonyme Funktion, die nicht das Symbol NIL ist, in einem booleschen Kontext als wahr ausgewertet wird. Du würdest also immer das erste Element nehmen. Ein bisschen mehr Tests könnten helfen. – coredump