COND子句仅测试

时间:2017-03-29 20:56:54

标签: common-lisp

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版本?

1 个答案:

答案 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))))