1073 words
5 minutes
Scheme(1.1)
2025-11-12

构造过程抽象#

1.1程序设计的基本元素#

  • 基本表达形式,用于表示语言所关心的最简单的个体。
  • 组合的方法,通过它们可以从较简单的东西出发构造出复合的元素。
  • 抽象的方法,通过它们可以为复合对象命名,并将它们当作单元去操作。

1.1.1 表达式#

(+ 3 2)
(- 100 7 22)
(/ 30 3 (+ 2 3))

像上面这样的表达式称为组合式,用一对括号括起一些表达式,形成一个表,表示一个过程应用。在表里最左的元素称为运算符,其他元素都称为运算对象。

1.1.2 命名和环境#

(define size 3)
  • size关联一个值3

1.1.3 组合式的求值#

  1. 对组合式的各个表达式求值。
  2. 将作为最左子表达式的值的那个过程应用于相应的实际参数(其他左表达式的值)。
    以上为通用求值规则,除此之外还有针对特殊形式的专门规则。如(define x 1)

复合过程#

  • 过程(procedure)定义的一般形式:
(define (<name> <formal parameters>) <body>)
  • <name>是一个符号,过程定义将在环境中关联于这个符号,为过程定义命名。
  • <formal parameters>形式参数。
  • <body>一个表达式。在应用这一过程时,这一表达式中的形式参数,将用与之对应的实际参数取代,对这样取代后的表达式求值,产生出这个过程应用的值。
(define (square x)
(* x x))
;;调用过程
(square 3)
(square (square (+ 2 3)))

过程应用的代换模型#

  • 代换的作用只是为了帮助我们领会过程调用中的情况,而不是对解释器实际工作方式的具体描述。

应用序和正则序

应用序求值:先求值参数而后应用(把所有参数表达式都求值,再把结果带入过程)可能会产生无限循环
正则序求值:完全展开而后规约(先把参数表达式原样代入过程,等到真正需要时才求值)。

条件表达式(Conditional Expression)和谓词(predicate)#

  • (cond)条件表达式的一般形式为:
(cond (<p1> <e1>)
(<p2> <e2>)
.
.
.
(<pn> <en>))

条件表达式的求值: 首先求值谓词,如果它的值是false,那么就求值,如果它的值也是false,就去求值。这一过程将继续下去,直到发现了某个谓词的值为true为止。此时解释器就返回相应子句中的序列表达式的值,以这个值做为整个条件表达式的值。如果无法找到值为真的<p>,cond的值就没有定义。

  • (cond)的另一种形式
(cond
.
.
.
(else <e>))
;;如果前面的所有子句都被跳过,会返回最后(else)中<e>的值。
  • (if)表达式
(if <predicate> <consequent>
<alternative>)
;;从<predicate>开始求值,如果<predicate>得到真值,解释器就去求值<consequent>并返回其值,否则它就去求值<alternative>并返回其值。
  • (and <e1>...<en>) 解释器将从左到右一个个求值<e>,如果某个<e>求值为假,这一(and)表达式都为假,后面的<e>也不再求值。如果所有的<e>都求出为真值,最后一个<e>的值为这一(and)表达式的值。

  • (or <e1>...<en>) 解释器将从左到右一个个求值<e>,如果某个<e>求值为真,这一(or)表达式都为真,后面的<e>也不再求值。如果所有的<e>都求出为假,这一(or)表达式的值为假。

  • (not <e>) 如果<e>求出的值是假,(not)表达式的值为真,否则其值为假。
    (not)表达式是一个普通过程。

1.1.8 过程作为黑箱抽象#

局部名 约束变量: 形式参数
自由变量: 外部环境所定义的变量

过程调用时的参数是值传递
表达式求值,它会用当前作用域的参数的值算出一个新的结果,不会改变参数的值。如(- x 1)
每次调用都会为参数创建新的绑定。
在同一层调用的作用域里参数的值是固定的,不会在这一层改变。

Scheme(1.1)
https://infini.cv/posts/scheme/scheme1/
Author
infini
Published at
2025-11-12
License
CC BY-SA 4.0

Some information may be outdated