Scheme是1970年代著名的函数式编程语言。是Lisp(LISt Processing)语言的一门变式。大多数人想到Scheme首先是其独特的语法,因为其采用前缀表示法和嵌套括号,并且具有一流的函数和优化的尾递归的特征,在当时属于较为新颖的特征。
就像和Python一样,Scheme原子表达式或者说基本表达式只要一个简单的步骤来评估。表达式包括数字,布尔型,符号。
scm> 1234 ; integer 1234 scm> 123.4 ; real number 123.4符号的作用像Python中的name,但是也不完全是。准确来说,Scheme中的symbol是一种值的类型。
scm> quotient ; A name bound to a built-in procedure #[quotient] scm> 'quotient ; An expression that evaluates to a symbol quotient scm> 'hello-world! hello-world! Booleans在Scheme中,除了#f这一特殊布尔值以外的所有值都解释为True值,即真值,不像Python,0也被认为是False值。
scm> #t #t scm> #f #f与Python中一样,Scheme调用表达式中的运算符位于所有的操作数之前。但是与Python不同的事,运算符在括号内,并且操作数使用空格分隔,而不用逗号分隔。但是,对于Scheme调用表达式的求值遵循与Python完全相同的规则。
评估运算符,评估一个过程从左往右评估操作数将过程应用于评估的操作数 scm> (+ 1 2) 3 scm> (- 10 (/ 6 2)) 7 scm> (modulo 35 4) 3 scm> (even? (quotient 45 2)) #t特殊形式表达式的运算符是特殊形式。特殊形式之所以“特殊”的原因是它们不遵循上一节中所述的三个评估规则。相反,每种特殊形式都遵循其自己的特殊执行规则,例如在评估所有操作数之前的短路。
以下的一些特殊形式有,if,cond,defined和lambda形式。
if特殊形式使我们可以基于预估值来评估两个表达式之一。if表达式必须有两个必需的参数和一个可选的第三个参数。
(if <predicate> <if-true> [if-false])第一个操作数是Scheme中的条件或者说预估值(predicate),这个表达式将被解释为#t或者#f,即真或者假。 评估if特殊形式的表达式的规则如下:
评估预估值(predicate)。如果预估值(predicate)返回为真值,则评估并返回<if-true>的值,否则,如果有的话,将评估并返回[if-false]的值。让我们来对比一下Scheme中的if表达式与Python中的if声明: Scheme
scm> (if (> x 3) 1 2)Python
if x > 3: ... 1 ... else: ... 2使用嵌套的if表达式似乎不是一种处理多条件情况较为实用的方法。我们可以实用cond特殊形式,这是一种通用条件表达式,类似于Python中的多子句if/elif/else条件表达式。
cond可以接受任意数量的字句作为参数。子句写为包含两个表达式的列表:(<p> <e>)。
每个子句中的第一个表达式是预估值(predicate),子句中的第二个表达式是与其预估值相对应的返回表达式,可选的else子句没有预估值。
评估规则如下:
依次评估预估值<p1>, <p2>, <p3>, …, <pn>,直到预估值为真。如果预估值为真,则求值并返回子句中的相应表达式。如果所有的预估值都不为真,并且存在else子句,则求值并返回<<>else-expression>。 scm> (cond ((> x 0) 'positive) ((< x 0) 'negative) (else 'zero))