2016-03-23 11 views
-3

私のプログラムでは、ある温度を華氏から摂氏に変換するか、あるいは逆の変換を行うことになっています。数字と文字を含むリストを取ります。手紙は温度であり、手紙は私たちがいる単位です。そして私は適切な機能をFからCまたはCからFのいずれかと呼んでいます。私の温度変換関数で最初にチェックされた与えられたリストを持つ関数をどのように呼び出すのですか?ここに私のコードです。再びtemperature-conversionを呼び出すF-to-Cを呼び出しtemperature-conversionlispで別の関数を呼び出すにはどうすればいいですか?

(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

あなたは無限再帰を持っています。

私はこれを行うだろう:

(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を追加しました。

関連する問題