2016-03-23 12 views
-3

Programım belirli bir sıcaklığı Fahrenheit'ten Centigrade'e veya başka bir yoldan çeviriyor. Bir sayı ve bir harf içeren bir listeyi alır. Mektup, sıcaklıktır ve harf, içinde olduğumuz birimdir. Ardından, uygun işlevi F-to-C veya C-to-F olarak adlandırıyorum. Sıcaklık dönüştürme fonksiyonumda ilk kontrol edilen verilen listeyle fonksiyonları nasıl ararım. İşte benim kodum. Yine temperature-conversion çağıran F-to-C çağırır temperature-conversion:lisp'de başka bir işlevi nasıl ararım;

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

cevap

3

Sen sonsuz özyinelemeye var.

Bunu yapacağını:

(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

Ben bu örnek genellikle fonksiyonları birinci sınıf değerleri olduklarını göstermek için kullanılır düşünüyorum.

sds's answer için küçük bir değişiklik yaptığınızda, uygun işlevi seçen bir deyimine sahip olabilirsiniz, bu daha sonra çevreleyen FUNCALL tarafından kullanılır.

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

Ben DESTRUCTURING-BIND durumda olduğunu henüz bilmiyorum eklendi.

İlgili konular