如何在lisp中调用另一个函数;

时间:2016-03-23 16:48:58

标签: lisp

我的程序应该将给定的温度从华氏温度转换为摄氏温度,或者相反。它包含一个包含数字和字母的列表。字母是温度,字母是我们所在的单位。然后我调用适当的函数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))

2 个答案:

答案 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以防您不知道它是什么。