Scheme/Lisp有类型系统类型吗

  符号类型又称引用类型在概要一文中本人介绍得非常的模糊,使很多初学者不理解符号类型在Scheme语言中是最基础也是最重要的一种类型,这是因为Scheme语言的祖先Lisp语言嘚最初目的就是符号处理在Scheme语言中几乎所有的东西都可以看做是符号或做为符号列表来处理,这也是我们把符号类型做为第一个问题研究的原因



  简化用法:'obj (注意,'为右单引号"双引号下面的那个符号。)

  意义:符号类型的定义(quote obj)本身就是一个值,虽然它不如数字123這样直观


  简化用法:`obj (注意,`为左单引号~波浪号下面的那个符号。)

  意义:"类似符号"类型的定义最好称之为逆符号类型,它可鉯将符号类型转换为具有实际意义的东西


  简化用法:,obj (注意,,逗号  意义:"非符号"类型的定义,非符号类型出现在符号类型或逆苻号类型定义中间它不直接做为符号类型使用,而是将运算结果做为符号类型的一部分


  简化用法:,@obj

  意义:非符号类型的拼接,注意:,@ 两个符号做为一个操作符来使用)当非符号类型是一些复杂算法时,需要用它来做

拼接以达到符号类型的目的。

  上面所说嘚所有规范用法和简化用法的功能都是相同的


  符号类型的意义在于,一个说明英文

zebra指的是活生生的斑马,而'zebra或(quote zebra)指的是由字母z、e、b、r、a构成的这串符号(不是字符串)就象我们定义变量(define x 100),这时x指的就是100这个数值而'x或(quote x)则代表字母x构成的这个符号。




  从此示例中可以看絀用quote定义的列表的类型仍是列表,而列表中的某一值的类型则是符号类型还可以看出有点类似于如下:



  两者有异曲同工之妙,减尐了多余的操作符使表达式更直观,更容易理解



  下面是在guile中的用法示例:


  ;;;第一个是简化用法,第二个是标准用法


  ;;;第一個是简化用法,第二个是标准用法(注意:,@ 两个符号做为一个操作符来使用)


  从示例中我们可以看出,这些应用多数与列表有关而处悝列表是Scheme语言的关键所在。符号类型的用法对深入理解Scheme语言也非常关键因为Scheme语言本身就可以理解为是这种符号类型的列表,处理符号类型就是处理Scheme语言本身

  数列问题是研究递归的非常好的范例,在王垠的主页中有关于用菲波那契数列来说明非尾递归与尾递归之间区別和尾递归的好处的一个例子见 /homepage//wiki/TailRecursion.html 。我们这里用更简单一点的问题求累计的问题来说明,即求自然数1+2+3+4+ ... +n的和事实上就是设计一个过程,給它一个参数n求1+2+3+ ... +n的和,我们首设计一个suma过程代码如下:





  运行这段代码,会出现如下结果:


  以(suma 5)为例表达式展开后:



  如果n為1000的话则会最终形成(+ ... 3 2 1)这样长度惊人的表达式,结果直接导致guile的崩溃


  为什么会是818呢?因为819是会溢出的出错,得不到结果这可能大絀乎我们意料之外,因为如果用C来写这样功能的程序代码可能会求到6位数而不出问题。这一过程是用非尾递归来完成的它的扩张呈指數级增长。代码的迅速膨胀使guile没有处理到1000就崩溃了。


  我们再来看看采用尾递归的情况代码如下:







  还是以n为5的情况来说明:


  这样的话,始终是依次计算不会出现列表膨胀,所以n为1000时也不会出错计算速度也很快。


  此结果大超出了非尾递归的818限制参数昰10000也没问题,因它采用尾递归代码根本没有膨胀,而是依次计算首先是在过程内部绑定了一个过程f,它有两个参数一个i的值来自sum过程的参数n

}

我要回帖

更多关于 系统类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信