Scheme SICP示例。cond工作,但如果不工作';T

Scheme SICP示例。cond工作,但如果不工作';T,scheme,sicp,mit-scheme,Scheme,Sicp,Mit Scheme,如果我使用SICP第1章中的以下代码,它会给出正确的答案 (cond ((= a 4) 6) ((= b 4) (+ 6 7 a)) (else 25)) 打印16 如果我把空调换成了如果它坏了 (if ((= a 4)6) ((= b 4) (+ 6 7 a)) (else 25)) 给出错误: The object #f is not applicable. 我做错了什么?为什么if不起作用 注意:这是练习1.1中的定义: (define a 3) (define b (+ a 1)

如果我使用SICP第1章中的以下代码,它会给出正确的答案

(cond ((= a 4) 6) ((= b 4) (+ 6 7 a)) (else 25)) 
打印
16

如果我把空调换成了如果它坏了

(if ((= a 4)6) ((= b 4) (+ 6 7 a)) (else 25))
给出错误:

The object #f is not applicable.
我做错了什么?为什么if不起作用

注意:这是练习1.1中的定义:

(define a 3)
(define b (+ a 1))

cond
if
是两种截然不同的句法结构。你不能简单地用一个名字来代替另一个

如果语法:

(if test
    (then part)
    (else part))
Cond语法:

(cond (test1 form11 ... form1n)
      (test2 form12 ... form2n)
      ...
      (else form1m ... formmn))
因此,相当于:

(cond ((= a 4) 6) 
      ((= b 4) (+ 6 7 a))
      (else 25)) 
是:


谢谢。我还有一个问题:下面的正确形式是什么:
(if(=ba)6)25
我已经想出了如何使用
cond
,但我似乎不明白
if
。我的意思是检查b=a然后是6-else 25。正如我所说的,正确的形式是
(如果条件然后是part-else-part)
,所以你的例子应该写
(如果(=ba)6-25)
。请记住,在Scheme中,括号是重要的,与几乎所有其他语言不同。对于isntance,如果您编写
(if(=ba)6)25)
,则将其解释为:
(if x25)
(错误,因为if有2个参数,而不是3个),其中x是
(=ba)6)
,其解释为:求值
(=ba)
,然后应用返回到6的函数(因为
(…)6
,这会产生另一个错误,因为
(=b a)
返回
#t
#f
,而不是函数。请注意,如果您想学习Scheme而不让所有括号丢失,则应正确对齐代码,使用理解架构语法的文本编辑器可以大大简化这一过程,像Emacs或DrRacket。非常感谢。我只是在笔记中写道,scheme括号的工作方式与其他语言不同(经过多次尝试和错误,我得到了if的正确形式)。你刚才解释得很简洁,我希望能理解。再次非常感谢。
(if (= a 4)
    6
    (if (= b 4)
        (+ 6 7 a)
        25))