10
解释器会返回
10
如果我们加个括号:
(10)
按理说多加点括号没什么害处啊,可是
解释器会报错说我们试图调用一个不是过程的东西10,这是怎么回事?
原来解释器只要遇到括号,就会假设括号中的第一个元素肯定是个“过程”(基本运算符也算过程),在这个例子中,解释器就误把10当成了过程调用,自然就出错了。
在看一个稍微复杂点的例子:
(+ 1 2)
返回
3
如果我们再加一层括号:
((+ 1 2))
解释器会报错说我们试图调用一个不是过程的东西3,原来里面那个括号计算得到3,整个过程变成(3),然后解释题误把3当成了一个过程去调用,就出错了;
在看一个更复杂点的例子:
定义一个绝对值的函数,正确的写法是:
(define (abs x)
(if (< x 0)
(- x)
x))
一种错误的写法是:
把(- x)写成(-x)
负号在这儿表示一个求负数的运算,是一个运算符,所以运算符和后面的数之间一定要有空格;
顺便提一点,负号的使用要注意,如果写一个负数,比如-10,此时负号不是运算符,是负数的一部分;如果负号用在一个表达式中,像上面的例子那样,则负号和操作数直接必须加一个空格;
另一个易犯的错误是在最后的x上多加一个括号:
(define (abs x)
(if (< x 0)
(- x)
(x)))
这样写,解释器也会报错,把最后的那个x当成一个过程调用。
所以,scheme对括号的处理和我们熟悉的其他语言很不一样,在常见的语言中,括号只是用来改变运算优先级,但是在scheme里,括号不是用来做这个的,而是用来表示一个(过程 操作数)形式的表达式的;