Program Structure 笔记1(scheme基础)
(作者:colinboy Email:cybbh@163.com) V2
(能力有限, 内容难免出现错误或一些专业词汇使用不当,只是个人笔记,能理解总体内容就好)
Scheme(一种函数式程序设计语言)
Scheme是一种解释型语言,需要一个解释器(Interpreter)运行scheme程序.
解释器有Mit-Scheme Stk-berkeley等.
表达式:
在stk 中,键入的任何数字都可以当作表达式,如果我们输入7,那么scheme就会计算此表达式的值,然后把此值返回,7是自求值表达式(就是说它的表示就代表了它的值),我们将看到scheme打印出7.
Scheme内置了很多基本运算符,例如+ - * /在scheme中都是基本运算符.
我们输入 (+ 3 5 9),scheme就会计算此基本运算符组成的表达式,然后表达式的值17.
括号代表了这是一个函数调用,这是scheme函数调用的形式,括号最左边是函数名,后面跟着函数的参数.
对于一些基本运算符,可以不传递任何参数,例如
(+ ) 会返回0
(* ) 会返回1 因为如果我们输入(* 5),会返回5,那么代表有一个隐含的1与5相乘,所以(*)会返回1.
我们可以在表达式前面加单引号组成表达式,那么此表达式返回的就是这个去掉引号的表达式.
例如
'myname 返回myname
'(+ 1 3) 返回(+ 1 3)
我们可以输入
(+ 1 '10) 会返回11. 因为'10表达式计算之后会返回10,这是一个合法数字,所以可以相加.
'10和(quote 10)是完成了同一种功能.
(quote myname) 返回myname
(quote (+ 1 3)) 返回(+ 1 3)
函数调用
(first 'this) 返回t
(first '(we are tired)) 返回 we
(last 'this) 返回 s
(last '(we are tired)) 返回 tired
嵌套函数调用:
一个函数调用可以当作另一个函数的参数,例如
(+ 2 (* 3 3)) 会返回11
(first (bf 'there)) 会返回h
对于嵌套函数调用, 解释器会先逐步计算每个嵌套函数的值,把函数的返回值当作最外层表达式的参数,例如
(+ 2 (* 3 3)) 会先计算 2 以及(* 3 3),2会返回2,(* 3 3)会返回9,然后把计算的结果替换对应的嵌套函数调用,替换后为(+ 2 9),之后计算结果为11
我们可以自己定义变量以及过程
(define pi 3.1415)
之后在stk种输入pi就会返回3.1415.
(* pi 5 5) 会返回78.5375
因为我们已经定义过pi,所以解释器知道pi的值.
(* pi 5 5) 等同于 (* 3.1415 5 5)
(define (square x)
(* x x))
上面的代码定义了一个函数,名称为square,有一个参数x,函数的返回值为(* x x).
解释器会把square这个名字和以上特定代码相关联.
(square 5) 会返回25,上面我们定义了square函数,解释器会计算square的值来确定如何执行.
(+ 1 2 3 4 5)这种把操作符放在表达式最前面的形式成为"前缀表示"(prefix notation),优点很明显,如果有很多参数我们不用重复的输入操作符,
类似这种1+2+3+4+5称为"中缀表示"(infix notation),当然还有"后缀表示"(postfix notation).
在下面代码中
(define (square x)
(* x x))
其中的(square x)中的x称为"形式参数"(formal parameter).
在 (square 5)中, 5称为"实际参数"(actual argument).实际参数的意思是某一固定时刻,此形式参数的实际值是多少.
对于上面自定义的square函数,如果我们不传入任何参数,解释器就会提示出现错误,这和 + * 基本运算符不同.
(square) //错误!!
(square (first '5s)) 返回25,因为(first '5s)会返回5,而5是一个合法的数字,所以可以正确执行.
对于任何表达式,在执行它的时候,会首先计算在它之内的每个子表达式的值!
对于(square (first '5s)),实际参数是一个表达式(first '5s),称作实际参数表达式(actual argument expression),会首先计算此表达式的值,结果返回5,返回的结果是一个实际参数表达式计算出来的值,之后根据实际参数值(actual argument value)计算整个表达式的值.
最后,如果要退出scheme解释器,可以输入
(exit)