Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
sicp-py-zh
提交
acb8573a
S
sicp-py-zh
项目概览
OpenDocCN
/
sicp-py-zh
9 个月 前同步成功
通知
1
Star
74
Fork
21
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
sicp-py-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
acb8573a
编写于
9月 09, 2016
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
3.6.1.
上级
eedb08f6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
96 addition
and
0 deletion
+96
-0
3.6.md
3.6.md
+96
-0
未找到文件。
3.6.md
浏览文件 @
acb8573a
...
...
@@ -17,3 +17,99 @@
Scheme 是 Lisp 的一种方言,Lisp 是现在仍在广泛使用的第二老(在 Fortran 之后)的编程语言。Scheme首次在 1975 年由 Gerald Sussman 和 Guy Steele 描述。Revised(4) Report on the Algorithmic Language Scheme 的引言中写道:
> 编程语言不应该通过堆砌特性,而是应该通过移除那些使额外特性变得必要的缺点和限制来设计。Scheme 表明,用于组成表达式的非常少量的规则,在没有组合方式的限制的情况下,足以组成实用并且高效的编程语言,它足够灵活,在使用中可以支持多数当今的主流编程范式。
我们将这个报告推荐给你作为 Scheme 语言的详细参考。我们这里只会设计重点。下面的描述中,我们会用到报告中的例子。
虽然它非常简单,Scheme 是一种真正的编程语言,在许多地方都类似于 Python,但是“语法糖[1]”会尽量少。基本上,所有运算符都是函数调用的形式。这里我们会描述完整的 Scheme 语言的在报告中描述的可展示的子集。
> [1] 非常遗憾,这对于 Scheme 语言的最新版本并不成立,就像 Revised(6) Report 中的那样。所以这里我们仅仅针对之前的版本。
Scheme 有多重可用的实现,它们添加了额外的过程。在 UCB,我们使用
[
Stk 解释器的一个修改版
](
http://inst.eecs.berkeley.edu/~scheme/
)
,它也在我们的教学服务器上以
`stk`
提供。不幸的是,它并不严格遵守正式规范,但它可用于我们的目的。
**使用解释器。**
就像 Python 解释器[2]那样,向 Stk 键入的表达式会由“读取-求值-打印”循环求值并打印:
```
scheme
>>>
3
3
>>>
(
-
(
/
(
*
(
+
3
7
10
)
(
-
1000
8
))
992
)
17
)
3
>>>
(
define
(
fib
n
)
(
if
(
<
n
2
)
n
(
+
(
fib
(
-
n
2
))
(
fib
(
-
n
1
)))))
fib
>>>
'
(
1
(
7
19
))
(
1
(
7
19
))
```
> [2] 在我们的例子中,我们使用了和 Python 相同的符号`>>>`和`...`,来表示解释器的输入行,和表示输出的非前缀行。实际上,Scheme 解释器使用不同的提示符。例子,Stk 以`STk>`来提示,并且不提示连续行。然而 Python 的惯例使输入和输出更加清晰。
**Scheme 中的值。**
Scheme 中的值通常与 Python 对应。
布尔值
真值和假值,使用
`#t`
和
`#f`
来表示。Scheme 中唯一的假值(按照 Python 的含义)就是
`#f`
。
数值
这包括任意精度的整数、有理数、复数,和“不精确”(通常是浮点)数值。整数可用标准的十进制表示,或者通过在数字之前添加
`#o`
(八进制)、
`#x`
(十六进制)或
`#b`
(二进制),以其他进制表示。
符号
符号是一种字符串,但是不被引号包围。有效的字符包括字母、数字和:
```
! $ % & * / : < = > ? ^ _ ~ + - . @
```
在使用
`read`
函数输入时,它会读取 Scheme 表达式(也是解释器用于输入程序文本的东西),不区分符号中的大小写(在STk 实现中会转为小写)。两个带有相同表示的符号表示同一对象(并不是两个碰巧拥有相同内容的对象)。
偶对和列表
偶对是含有两个(任意类型)成员的对象,叫做它的
`car`
和
`cdr`
。
`car`
为
`A`
且
`cdr`
为
`B`
的偶对可表示为
`(A . B)`
。偶对(就像 Python 中的元组)可以表示列表、树和任意的层次结构。
标准的 Scheme 列表包含空的列表值(记为
`()`
),或者包含一个偶对,它的
`car`
是列表第一个元素,
`cdr`
是列表的剩余部分。所以,包含整数
`1, 2, 3`
的列表可表示为:
```
scheme
(
1
.
(
2
.
(
3
.
())))
```
列表无处不在,Scheme 允许我们将
`(a . ())`
缩略为
`(a)`
,将
`(a . (b ...))`
缩略为
`(a b ...)`
。所以,上面的列表通常写为:
```
scheme
(
1
2
3
)
```
过程(函数)
就像 Python 中一样,过程(或函数)值表示一些计算,它们可以通过向函数提供参数来调用。过程要么是原始的,由 Scheme 的运行时系统提供,要么从 Scheme 表达式和环境构造(就像 Python 中那样)。没有用于函数值的直接表示,但是有一些绑定到基本函数的预定义标识符,也有一些 Scheme 表达式,在求值时会产生新的过程值。
其它类型
Scheme 也支持字符和字符串(类似 Python 的字符串,除了 Scheme 区分字符和字符串),以及向量(就像 Python 的列表)。
**程序表示。**
就像其它 Lisp 版本,Scheme 的数据值也用于表示程序。例如,下面的 Scheme 列表:
```
scheme
(
+
x
(
*
10
y
))
```
取决于如何使用,可表示为三个元素的列表(它的最后一个元素也是三个元素的列表),或者表达为用于计算
`x+10y`
的 Scheme 表达式。为了将 Scheme 值求值为程序,我们需要考虑值的类型,并按以下步骤求值:
+
整数、布尔值、字符、字符串和向量都求值为它们自己。所以,表达式
`5`
求值为 5。
+
纯符号看做变量。它们的值由当前被求值环境来决定,就像 Python 那样。
+
非空列表以两种方式解释,取决于它们的第一个成员:
+
如果第一个成员是特殊形式的符号(在下面描述),求值由这个特殊形式的规则执行。
+
所有其他情况(叫做组合)中,列表的成员会以非特定的顺序(递归)求值。第一个成员必须是函数值。这个值会被调用,以列表中剩余成员的值作为参数。
+
其他 Scheme 值(特别是,不是列表的偶对)在程序中是错误的。
例如:
```
scheme
>>>
5
; A literal.
5
>>>
(
define
x
3
)
; A special form that creates a binding for symbol
x
; x.
>>>
(
+
3
(
*
10
x
))
; A combination. Symbol + is bound to the primitive
33
; add function and * to primitive multiply.
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录