2013-11-01 41 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