与Lisp“if”和“cons”命令混淆

时间:2014-05-22 06:39:47

标签: if-statement common-lisp land-of-lisp

我正在阅读Conrad Barski的Land of Lisp,我对'if'命令的使用感到有些困惑(仅举几例)..

所以,我理解写'if'()表示列表为空且条件为false,如果'(1)表示列表非空且条件为真。

问题是lisp如何根据if(1)条件的性质(真/假)知道选择和输出哪个表达式?例如,在语句下面的代码中,如果'(1)为真,那么lisp如何以及为什么选择表达式I-AM-TRUE作为输出?

(if '(1)
    'i-am-true
    'i-am-false)
I-AM-TRUE

同样如何以及为什么输出如何在下面的例子中发生这种情况。

(if '(1)
    'how-does-this-happen
    'any-guesses)
HOW-DOES-THIS-HAPPEN

2 个答案:

答案 0 :(得分:2)

if语句的结构是:

(if condition true-stament false-statement)

换句话说,第一个语句(true-statement)总是在条件evals为true时发生,第二个语句(false-statement)在条件eval为false时发生。

答案 1 :(得分:0)

if特殊形式的使用方式如下:

(if predicate consequent alternative)

在Common Lisp中,false值是空列表nil,由nil()表示。真值为T,其他每个值都不是nil。如果谓词评估除nil之外的任何内容,则它为真,并对结果进行评估。如果不是,则评估替代方案。

(defun my-not (x)
  (if x nil t))

(my-not ())   ; ==> t
(my-not nil)  ; ==> t
(my-not '())  ; ==> t
(my-not 'nil) ; ==> t
(my-not t)    ; ==> nil
(my-not 'this-is-atruth-value) ; ==> nil