2016-03-23 4 views
-3

Моя программа должна преобразовывать заданную температуру от Фаренгейта до Сториград или наоборот. Он содержит список, содержащий число и букву. Буква - это температура, а буква - это единица, в которой мы находимся. Затем я вызываю соответствующую функцию либо F-to-C, либо C-to-F. Как мне вызвать функции с указанным списком, который был впервые проверен в моей функции преобразования температуры. Вот мой код.Как вызвать другую функцию в lisp;

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

ответ

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 
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 в случае, если вы еще не знаете, что это такое.