2016-03-23 11 views
-3

Mein Programm soll eine gegebene Temperatur von Fahrenheit in Celsius oder umgekehrt umwandeln. Es nimmt eine Liste auf, die eine Nummer und einen Buchstaben enthält. Der Buchstabe ist die Temperatur und der Buchstabe ist die Einheit, in der wir uns befinden. Dann rufe ich die entsprechende Funktion entweder F-zu-C oder C-zu-F auf. Wie rufe ich die Funktionen mit der angegebenen Liste auf, die zuerst in meiner Temperaturumrechnungsfunktion überprüft wurde. Hier ist mein Code.Wie rufe ich eine andere Funktion in Lisp auf;

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

Antwort

3

Sie haben eine unendliche Rekursion: temperature-conversionF-to-C Anrufe, die wieder temperature-conversion nennt.

Ich würde dies tun:

(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

Ich denke, dieses Beispiel im Allgemeinen zu zeigen, verwendet wird, wie Funktionen erstklassige Werte.

Mit einer kleinen Änderung an sds's answer können Sie eine ECASE-Anweisung haben, die die entsprechende Funktion auswählt, die dann von einem umgebenden FUNCALL verwendet wird.

(defun temperature-conversion (spec) 
    (destructuring-bind (temperature unit) spec 
    (funcall 
     (ecase unit (C#'c2f) (F #'f2c)) 
     temperature))) 

Ich habe ein DESTRUCTURING-BIND, falls Sie noch nicht wissen, was es ist.

Verwandte Themen