If statement lisp中是否有嵌套的if?

If statement lisp中是否有嵌套的if?,if-statement,nested,lisp,structure,If Statement,Nested,Lisp,Structure,在大多数lisp中,105) (格式t“第一个数字大于~%”) (< 10 15) (格式t“第二个数字大于~%”) (= 10 10) (格式t“两个数字相等~%”) 是您要找的吗?我不确定,因为语法很混乱。我将其与C语言的嵌套if进行了比较,我想知道LISPLisp Nestedif是否与C Nestedif类似。您可以在任何允许使用任何表达式的地方使用if,包括在另一个if中。为什么在第二种情况下打印第一个数字大于,其中10不大于15?顺便说一句,您没有嵌套问题中的数字,在你所说的第一个语

在大多数lisp中,
的语法是
(if[])
,尽管可能有一些变化:有时
是强制性的,在一些较旧的lisp中,
可以有多种形式(我认为elisp是目前唯一常用的lisp)。因此,如果嵌套的
很简单:

(if (> 10 5)
    (format t "First number is greater ~%"))
    
    (if (> 10 15) 
        (format t "First number is greater ~%")
        (format t "Second number is greater ~%"))
        
        (if (= 10 10)
        (format t "Both numbers are equal"))
这在缩进方面很烦人,因此有一种称为
cond
的形式,在公共Lisp中,上面的表达式是:

(if a
    ...
  (if b
      ...
    (if c
        ...
      ...)))
还是在计划中

(cond
 (a ...)
 (b ...)
 (c ...)
 (t ...))
cond
具有一个很好的特性,即所有的
都可以是多种形式

如果你没有
cond
,你可以用
If
:这里有一个使用Scheme宏的版本(实际上Racket的:
void
我认为是Racket),叫做
kond

(cond
 (a ...)
 (b ...)
 (c ...)
 (else ...))
类似地,如果您没有
if
,您可以使用
cond
来编写它:这里有一个名为
yf
的代码,再次使用Scheme宏使用
kond
来编写:

(define-syntax kond
  (syntax-rules (else)
    [(_)
     (void)]
    [(_ (else form ...))
     (begin form ...)]
    [(_ (test form ...)
        more ...)
     (if test
         (begin form ...)
         (kond more ...))]))
这两种可能都有不同的车

从历史上看,
cond
是我认为最原始的

(define-syntax yf
  (syntax-rules ()
    [(_ test result)
     (kond (test result))]
    [(_ test result otherwise)
     (kond (test result)
           (else otherwise))]))
(cond(>105)
(格式t“第一个数字大于~%”)
(< 10 15)
(格式t“第二个数字大于~%”)
(= 10 10)
(格式t“两个数字相等~%”)

是您要找的吗?我不确定,因为语法很混乱。我将其与C语言的嵌套if进行了比较,我想知道LISPLisp Nested
if
是否与C Nested
if
类似。您可以在任何允许使用任何表达式的地方使用
if
,包括在另一个
if
中。为什么在第二种情况下打印
第一个数字大于
,其中10不大于15?顺便说一句,您没有嵌套问题中的数字,在你所说的第一个语法/示例中,如果嵌套if中的所有条件都为true,那么不应该打印所有语句吗?@Zel:不,第一件事是true,如
if(…)。。。;否则如果(…)。。。;否则if
是Lisp中的表达式,因为Lisp是一种表达式语言:没有语句,所以
(+(if x 1 2)3)
就可以了)。这里的括号放错了。您应该有
(cond(test1exp1…(test2exp2…)
,其中的测试类似于
(>105)
。如果需要,还可以添加
(else exp3…
子句。
(cond ((> 10 5)
    (format t "First numbers is greater. ~%")
    (< 10 15)
         (format t "Second number is greater. ~%")
         (= 10 10)
             (format t "Both numbers are equal. ~%")))