2013-11-01 90 views
-1

簡單defun定義我想一些基本的東西了在CL,不明白爲什麼這個不能編譯,編譯器錯誤:使用COND

(defun ifelse (the-test) 
    (cond ((the-test) (format t "passed test")) 
    (t (format t "failed test")))) 

編譯器說:

; caught STYLE-WARNING: 
; undefined function: THE-TEST 

我已經做了類似與if無故障:

(defun test-if (the-test) 
    (if the-test 
     (format t "passed") 
     (format t "failed"))) 

編譯器不抱怨。 cond不會以同樣的方式工作,因爲它們都測試條件?

; in: DEFUN IFELSE 
;  (DEFUN IFELSE (THE-TEST) 
;  (COND ((THE-TEST) (FORMAT T "passed test, true!")) 
;    (T (FORMAT T "failed test, boo hoo")))) 
; --> PROGN EVAL-WHEN 
; ==> 
; (SB-IMPL::%DEFUN 'IFELSE 
;     (SB-INT:NAMED-LAMBDA IFELSE 
;      (THE-TEST) 
;      (BLOCK IFELSE (COND (# #) (T #)))) 
;     NIL 'NIL (SB-C:SOURCE-LOCATION)) 
; 
; caught STYLE-WARNING: 
; The variable THE-TEST is defined but never used. 

;  (THE-TEST) 
; 
; caught STYLE-WARNING: 
; undefined function: THE-TEST 
; 
; compilation unit finished 
; Undefined function: 
;  THE-TEST 
; caught 2 STYLE-WARNING conditions 
+0

哪個實現的Common Lisp您使用的是?你還有什麼涉及'the-test'的定義/編譯?您的代碼在SBCL中編譯並運行時沒有警告或其他問題。 –

+0

@TerjeD。我更新了questin。 – johnbakers

+0

您可能希望在錯誤消息和問題中具有相同的源代碼。目前它是不同的。 爲什麼COND與IF不同?因爲它們是不同的結構。檢查文檔的語法。 –

回答

3

從完整的編譯器錯誤

(DEFUN IFELSE (THE-TEST) 
(COND ((THE-TEST) ... 

你的代碼是不同的:

(defun ifelse (the-test) 
    (cond (the-test ... 

過程中你的測試你可能改變你的代碼。

在您的實際代碼,您使用的變量的測試

在編譯器錯誤的函數試圖調用函數(的測試)

+0

你釘了它,謝謝。 – johnbakers