Lisp等于没有按预期工作

时间:2016-03-24 18:28:52

标签: lisp

我对这种语言越来越熟悉了。但我有一个问题......我正在研究一个将温度转换为celcius或F的函数。我正在传递一个列表(50 C),然后分别处理每个案例。出于某种原因,当我这样做(equp“C”(cadr lst))我得到NIL.I打印出列表的干部,它是C.任何想法?

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

2 个答案:

答案 0 :(得分:6)

如果您根据评论将convert-temp称为(convert-temp '(30 C)),则(cadr lst)C,即符号,但您将其与{{1}进行比较一个字符串。

因此,您需要比较"C"中的符号:convert-temp

或传入字符串:(equalp 'C (cadr lst))

符号通常与(convert-temp '(30 "C"))进行比较,因此在第一种情况下,您可以说eq

答案 1 :(得分:4)

如果你真的想比较字符串和符号:

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

但您可能应该与带有EQ的符号进行比较,或者仅使用案例进行比较:

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