当COND
只给出一个测试子句而没有其他任何内容时,它总是返回测试结果:
CL-USER> (cond (t))
T
CL-USER> (cond ((> 5 10)))
NIL
COND
只是一种写IF
语句的方法吗?
这不适用于仅使用测试重写COND
:
CL-USER> (if (> 5 1))
error while parsing arguments to DESTRUCTURING-BIND:
too few elements in
((> 5 1))
to satisfy lambda list
(SB-IMPL::TEST SB-IMPL::THEN &OPTIONAL SB-IMPL::ELSE):
between 2 and 3 expected, but got 1
如果是这样,那么COND
如何将每个子句完全转换为IF
版本?
答案 0 :(得分:2)
当COND只给出一个测试子句而没有其他任何内容时,它总是返回测试结果:
没错。根据{{3}}上的HyperSpec条目:
结果---第一个子句中表单的值,其test-form为true,如果该子句中没有表单,则为test-form的主要值,如果没有test-form则为nil真正。
COND不是一种编写IF语句的方法吗?
嗯, cond 被声明为宏,而cond是一个特殊的运算符,所以你可以这样想,虽然扩展 cond < / strong>没有具体定义。但是 if 是使用需要 then-part 的语法定义的,而 cond 则不是。以下是没有表单的 cond 子句扩展为(在SBCL中):
CL-USER> (pprint (macroexpand '(cond ((+ 2 3)))))
(LET ((#:G1013 (+ 2 3)))
(IF #:G1013
#:G1013
(COND)))
表单的值保存在一个值中,然后用作 then-part 。当子句中有 形式时,它们包含在 progn (返回其最后一个表单的值)中:
CL-USER> (pprint (macroexpand
'(cond
((= 2 3) 42 78)
((+ 2 3))
((= 4 5) (print 'something-else)))))
(IF (= 2 3)
(PROGN 42 78)
(COND ((+ 2 3)) ((= 4 5) (PRINT 'SOMETHING-ELSE))))