scheme中,括号不能随便加

一个最简单的scheme程序就是:
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里,括号不是用来做这个的,而是用来表示一个(过程 操作数)形式的表达式的;

转载于:https://my.oschina.net/mayqlzu/blog/93824

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值