Scheme语言--简单介绍

     一年前事实上有时间看完SICP这本书,后来因为种种缘由,一直没有继续再学。因为SICP中使用Scheme确实应用很少。在Java,C++的语言眼里,Scheme确实很是另类。如今MIT已经放弃了使用Scheme做为SICP的教学语言而转向python之际,我在此開始学习这本书与这门语言的学习。SICP主要使用Scheme语言来解决计算机科学中的一些问题。为了督促本身,天天都能学习。积小流而成江海,把本身的学习过程放在这里,以供本身复习。python

     本系列主要包含两部分Scheme语言层面的问题及SICP中的课程方面,两个部分相辅相成。今天開始Scheme语言的第一节。函数

Scheme简单介绍 学习

Scheme语言是Lisp语言的一种变种,是一种表处理语言。其语法简单,easy学习,可以使使用者专著于解决这个问题而非语言自己。递归

1.1 基本类型 字符串

scheme支持的基本数据类型有整数,实数,分数,复数,对这些基本类型可以使用这些类型之上的各类操做如+-*/%等等。字符串””,记号quote。对于quote,(quote exp)表示exp为记号,不进行解析。常写做’exp。string


List有两种类型,一种结尾元素为空表(),(list ‘a ‘b ‘c),等价与(cons ‘a (cons ‘b (cons ‘c ‘() ))),还有一种表为不正常表,表尾为结尾元素,(cons ‘a (cons ‘b ‘c)) 这样的表的值是(a b.c),.表示其后元素为表的结尾元素。class


表的操做
car:取表的第一个元素
cdr:表在取car后的其他部分,对于正常表,其结果是一个表,对非正常表,结果多是一个元素。
cons:构造表,假设第二个參数是表,则将第一个參数做为整体放在第二个參数的表中。
List:构造表,将各个參数作为整体放在一个表中。
构造正常表的还有一种方法:使用quote即’ 如’(a b c)。test


1.2 变量绑定
( let ((arg1 val1) (argv2 val2)  …) exp1 exp2 … )
变量绑定仅仅在当前的let表达式中有效,好比(let ((+ *)) (+ 2 3)  =6)
Let操做可以嵌套运行,但绑定仅仅对let内部可见,对外层let不可见。计算机科学


1.3 lambda表达式
(Lambda (arg1 …) exp1 exp2)
从演算来看,(let ((var value) …) exp1 exp2…) == ((lambda (var …) exp1 exp2 …) value … )
对于Lambda函数的參数
假设形參仅仅有一个,则可以有随意数量的实參,所有实參被格式化为一个list传给函数。
假设形參list是不正常的list的形式,则形參相应的实參被一一映射,然后的实參被格式化成一个list传给.后的形參,这也意味着,实參个数必须保证形參个数。假设形參是一个正常的list,则实參必须被一一映射。
所以((lambda (x) x) ‘a) = a 而((lambda x  x) ‘a) = (a)

1.4 define定义
Define定义的是全局可见的,在scheme中,可以定义一个过程,当中使用一个没有定义的过程,这不会引发错误,但假设你使用它,就会出现错误,除非你补充定义了所引用的过程。
(define mylist (lambda x  x))变量


1.5 条件表达式
If表达式:(if cond1 result1 result_other)
Cond表达式:( cond  (test1  exp1) (test2 exp2) … (else expn ))也可以罗列所有,而不用else
Or表达式:(or exp1 exp2 …)
Not表达式:(not exp)使得#f #t之间转换。


关于类型推断:
(type? Var)可以得出var是不是type类型的,典型的类型有null,number,string,list,pair…
Eqv?可以推断两个值是否相等


1.6 递归过程
一个过程定义中调用了本身,递归过程通常分两部分,终止部分与递归部分。


1.7 map操做
( map fun argv …)
映射操做将fun应用到agv..的各个元素上,并返回一个list。如下是两个演示样例:
(map abs '(1 -2 3 -4 5 -6)) => (1 2 3 4 5 6)

 

(define trans

   (lambda (lst)

      (cons (map car lst) (map cdr lst))))

(trans '((a.1) (b.2) (c.3))) => ((a b c) 1 2 3)

 

1.8 赋值操做 Set!用来设置变量的值。变量可以是全局的,也可以是局部的。Set!使用的变量必须是事先定义过的。可以是let也可以是define。

相关文章
相关标签/搜索