2016-03-24 5 views
1

私はこの言語でゆっくりと快適になっています。しかし、私は問題を抱えています...私は温度を摂氏またはFに変換する関数に取り組んでいます。私はそのようなリスト(50 C)を渡して、それぞれのケースを別々に処理しています。何らかの理由で、私が(C "(cadr lst)を等しくする)私はNILを得ています。私はリストの指導者をプリントアウトしています。それはCです。Lispは期待どおりに動作しません

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

あなたが本当に文字列や記号を比較したい場合は、私は

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

実際のコードを見ずに答えるのは難しいです。しかし確かに 'C'(シンボル)は' 'C ''(文字列)と等しくありません。 – Sean

+0

コードを追加します –

+0

'convert-temp'もどのように呼び出されているのかを知る必要があります。 – Sean

答えて

6

convert-tempをあなたのコメントとして(convert-temp '(30 C))と呼んでいる場合は、(cadr lst)Cですが、シンボルは"C"、文字列と比較しています。

ですから、convert-temp内のシンボルを比較するために、いずれかの必要があります。(equalp 'C (cadr lst))

をまたは文字列を渡す:最初のケースでは、あなたが(eq 'C (cadr lst))を言うことができるよう(convert-temp '(30 "C"))

シンボルは、通常、eqと比較されています。

+0

は本当に感謝しています。Sean =) –

+0

これは非常に重要です! Lispでは、データ内にラベルを付けるための一意の識別子を持つだけで、実行時文字列処理は行いません。 Lispはあなたの 'C'トークンを読むとき、その名前を文字列' 'C" 'であるオブジェクトに変換しますが、それは比較的重要ではありません。 「EQ」テストは、効率的な比較であり、通常は2つの機械語(しばしばアドレスサイズのもの、すなわちポインタ)を比較することによって実施される。 '(eq 'c(cadr lst))'は、リストの 'CADR'であることを意味します**' C'と同じオブジェクト**ですか?低レベルの用語では、これらの2つの値はヒープ内の同じメモリを指します。 – Kaz

4

を作っていますコール:

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

をしかし、あなたはおそらくEQとシンボルと比較、または単純でなければなりませんケース:

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

コアダンプありがとう! –

関連する問題