2016-11-19 31 views
6

在elisp中,if语句逻辑只允许我有if case和else case。Elisp:我怎么能表达其他 - 如果

(if (< 3 5) 
    ; if case 
    (foo) 
    ; else case 
    (bar)) 

但是如果我想要做别的 - 如果?我需要在else情况下放置一个新的if语句吗?它看起来有点混乱。

+3

请参阅['cond'](https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html) – jkiiski

回答

11

嵌套如果

由于(if test-expression then-expression else-expression)else if部分将巢新ifelse-expression

(if test-expression1 
    then-expression1 
    (if test-expression2 
     then-expression2 
     else-expression2)) 

使用COND

在其他语言的else if通常是在同一水平。在lisps我们有cond。这里是完全相同的用cond

(cond (test-expression1 then-expression1) 
     (test-expression2 then-expression2) 
     (t else-expression2)) 

注意,一个表达式可以是公正的。任何经常表达的表达方式都像(some-test-p some-variable),其他表达式通常也是如此。很少有他们仅仅是被评估的单个符号,但它可以用于非常简单的条件。

+1

我会说“use cond'”可能是最习惯的解。有时候,嵌套ifs会使事情变得更加清晰,但很少有人认为“use cond”是一种明智的第一种方法。 – Vatine

+0

@Vatine我同意只要if树在一个分支上很重。如果你有这样的话(如果(红色?)(如果(方形?o)'红色方形'红色圆形)(如果(方形?o)'蓝色方形'蓝色圆形) ((cond((和(red?o)(square?o))'red-square)((red?o)'red-round)((square?o)'blue-square) (t'蓝色圆形))'。对于平均每次3.25次测试和2次测试,使用'cond'代码稍微混乱一点。如果我没有使用'if'中的任何额外功能,我从不使用'cond'。例如。 '(如果测试然后其他人)'我永远不会写'cond' – Sylwester

+0

是的,我没有说“永远不会使用它”的原因之一。有时候嵌套'if'(或者多个'when',用''或'包裹','用'if'里面)比'cond'更清晰。 – Vatine

相关问题