我的程序应该将给定的温度从华氏温度转换为摄氏温度,或者相反。它包含一个包含数字和字母的列表。字母是温度,字母是我们所在的单位。然后我调用适当的函数F-to-C或C-to-F。如何使用在温度转换功能中首次检查的给定列表调用函数。这是我的代码。
(defun temperature-conversion (lst)
(cond
((member 'F lst) (F-to-C))
((member 'C lst) (C-to-F))
(t (print "You didn't enter a valid unit for conversion"))
)
)
(defun F-to-C ()
;;(print "hello")
(print (temperature-conversion(lst)))
)
(defun C-to-F ()
(print "goodbye"))
;;(print (temperature-conversion '(900 f)))
(setf data1 '(900 f))
答案 0 :(得分:3)
您有无限递归:temperature-conversion
调用F-to-C
再次调用temperature-conversion
。
我会这样做:
(defun c2f (c) (+ 32 (/ (* 9 c) 5)))
(defun f2c (f) (/ (* 5 (- f 32)) 9))
(defun temperature-conversion (spec)
(ecase (second spec)
(C (c2f (first spec)))
(F (f2c (first spec)))))
(temperature-conversion '(32 f))
==> 0
(temperature-conversion '(100 c))
==> 212
(temperature-conversion '(100))
*** - The value of (SECOND SPEC) must be one of C, F
The value is: NIL
The following restarts are available:
ABORT :R1 Abort main loop
答案 1 :(得分:2)
我认为这个例子通常用于演示函数是如何成为一等值的。
通过对sds's answer的一点修改,您可以使用ECASE
语句选择适当的函数,然后由周围的FUNCALL
使用。
(defun temperature-conversion (spec)
(destructuring-bind (temperature unit) spec
(funcall
(ecase unit (C #'c2f) (F #'f2c))
temperature)))
我添加了DESTRUCTURING-BIND
以防您不知道它是什么。