2016-03-24 38 views
1

Ich werde langsam mit dieser Sprache vertrauter. Aber ich habe ein Problem ... Ich arbeite an einer Funktion, die eine Temperatur entweder in Celsius oder in F umwandelt. Ich übergebe eine Liste als solche (50 C) und behandle dann jeden Fall einzeln. Aus irgendeinem Grund, wenn ich (gleich "C" (cadr lst)) mache, bekomme ich NIL. Ich habe den Cadr der Liste ausgedruckt und es ist C. Irgendwelche Ideen?Lisp funktioniert nicht wie erwartet

(defun convert-to-c(num) 
    (* (- num 32) 5/9) 
) 

(defun convert-to-f(num) 
    (+ (* num 9/5) 32) 
) 

(defun convert-temp (lst) 
    (cond ((equalp "C" (cadr lst)) (convert-to-f (car lst))) 
    (t (convert-to-c (car lst)))) 
) 

Der Anruf ich, damit ich bin

(convert-temp '(30 C)) 
+5

Schwer zu beantworten, ohne auf den eigentlichen Code zu schauen. Aber natürlich ist 'C' (das Symbol) nicht gleich" C "(eine Zeichenkette). – Sean

+0

Ich füge den Code –

+0

hinzu Wir müssen sehen, wie 'convert-temp' auch aufgerufen wird. – Sean

Antwort

6

Wenn Sie nach Ihrem Kommentar convert-temp als (convert-temp '(30 C)) anrufen, dann ist (cadr lst)C, ein Symbol, aber Sie vergleichen es mit "C", eine Zeichenfolge.

Also müssen Sie entweder Symbole in convert-temp vergleichen: (equalp 'C (cadr lst))

Oder in einem String übergeben: (convert-temp '(30 "C"))

Symbole werden in der Regel im Vergleich zu eq, so im ersten Fall, dass Sie (eq 'C (cadr lst)) sagen konnte.

+0

wirklich schätzen es Sean =) –

+0

Das ist sehr, sehr wichtig! In Lisp führen wir keine Laufzeit-String-Verarbeitung durch, nur um eindeutige Bezeichner für die Kennzeichnung von Dingen in unseren Daten zu haben. Wenn Lisp Ihr ​​'C'-Token liest, konvertiert es das in ein Objekt, dessen Name die Zeichenkette" C "ist, ist aber relativ unwichtig. Der "EQ" -Test ist ein effizienter Vergleich, der üblicherweise durch Vergleichen von zwei Maschinenworten (oft Adreßgrößen, d. H. Zeigern) implementiert wird. '(eq 'c (cadr lst))' bedeutet, ist das 'CADR' der Liste ** das gleiche Objekt ** wie das Symbol' C'? Auf niedriger Ebene: Zeigen diese beiden Werte auf dasselbe Speicherelement im Heap. – Kaz

4

Wenn Sie wirklich Strings und Symbole vergleichen wollen:

(string= 'c "C") 
=> T 

Aber Sie sollten wahrscheinlich vergleichen gegen ein Symbol mit EQ oder einfach mit ein Fall:

(ecase ... 
    (c (c2f ...)) 
    (f (f2c ...))) 
+0

danke coredump! –

Verwandte Themen