profile photo

一起学习魔法吧(0)

2019-11-11 16:31:18

开始念动咒语吧!

古老的魔法

从某种意义上讲,写程序和念咒语是没什么区别的。不信你看:

   int number  =  5;
   number ++;

例如上面这个 c 语言程序片段,我们念动咒语 int number = 5 就把 5 赋值给了 number,这好比念动咒语让帽子里出现鸽子。魔法师是分派别的,他们念动的咒语不同,效果也不用。写程序也是如此,程序编写者使用的语言不同,就好像念动不同派别的咒语。在辉煌的程序语言家族里,有一门较为古老的语言,lisp。这个系列要了解的就是它的一门方言 scheme,让我们先来看看这们语言的基础吧:

>(display "Hello Scheme!")
Hello Scheme!
>

(注:关于法杖(开发环境)的获取,网络上有许多经验,故不再赘述) 这门古老的语言和一般的语言不太相同,例如最基本的表达式:

>(3 + 4)
application: not a procedure;
expected a procedure that can be applied to arguments
given: 3
arguments...:
>

额,看来我们念错了咒语。(还好没被吸进魔法书里)我们看看计算机向我们抱怨了什么,它说这并不是一个过程,现在需要一个过程来应用于参数上。看来计算机认为我们输入的(3 + 4)是参数。其实正确的咒语是这样的:

>(+ 3 4)
7
>

这也可以理解,不过就是把加法应用在 3 和 4 上,也没什么复杂的嘛!其他的基本运算也是如此:

>(+ 3 4)
(* 3 4)
(- 3 4)
(/ 3 4)

7
12
-1
3

4

看起来还都不错,除了最后一个,那是什么?这个东西太诡异了吧,仔细看看好像是分数?等等,你别骗我,计算机可不能搞出来分数。我知道 IEEE754!别想骗我!是的,计算机本身不能表示分数(其实你也可以强行搞,得不偿失),但是不代表我们不能弄出分数结构对不对? 我猜你肯定在想这个吧?

>(/ 2 4)
1

2
>

嘿嘿,事情并不像你想的那样吧,显然我们完全可以用分数进行计算,这就像 1+1 = 2 (当然这是十进制加法,皮亚诺公理下的)一样。我们再试试这样?:

>(+ 6 3/4)
   3
 6 —
   4
>

(当然这个比例不太对,但是结果的结构是正确的)能看得出来这是带分数,下面我们看看小数:

>(* 0.43 0.7)
0.301
>

不错,scheme 直接计算小数乘法还是不错的,不如我们再做一些好玩的事?

>(+ 9999999999999999999999999999 233333333333333333333333333)
10233333333333333333333333332

你在干什么!机器会被你玩坏的!额,但是看上去好像一点问题都没有啊。对了,我们在念动咒语的时候并不像 c 那样要念出我们要召唤精灵的名字(int,char,double,float...)我们直接进行了计算,可见 scheme 不像 c 语言那样是静态类型而是动态类型。所以我们也不用担心 Int 的溢出问题了。 刚才我们试的所有式子都是(operator exp exp)的形式,我们不如试试别的?

>(+ 0.321 0.32143 0.5634)
1.2058300000000002

这不对啊,这根本不是他们算出来的结果啊。虽然 scheme 的小数可以直接输入操作,但如同 c 中的 float,double 一样有精度的限制。(IEEE754) 这节我们了解了基础的运算和一些规则,但是我们还没有掌握其他的一些必要工具,我们将在下节中介绍。