Scheme 内置过程参考
最后更新:2021年秋季
本文档作为 Scheme 项目和教职员 Scheme 解释器中内置过程的参考。网页解释器包括 几个额外的内置过程。
在所有下面的语法定义中,<x> 指的是可以变化的可选元素 x,
而 [x] 指的是可选元素 x。省略号
表示一个可以有多个前面的元素。假设对于所有这些内置过程,
元素表示的是已求值的参数,而不是输入的字面表达式。
核心解释器
apply
(apply <procedure> <args>)
使用给定的 args 列表调用 procedure。
对于宏,这具有在不初始引用的情况下调用宏的效果,
或者最终求值。因此,apply 将宏视为函数。
示例:
scm> (apply + '(1 2 3))
6
display
(display <val>)
打印 val。如果 val 是 Scheme 字符串,它将不带引号输出。
不会自动包含换行符。
displayln
(displayln <val>)
类似于 display,但在末尾包含换行符。
error
(error <msg>)
引发一个以 msg 作为消息的 SchemeError。如果没有 msg,
错误消息将为空。
eval
(eval <expression>)
在当前环境中求值 expression。
示例:
scm> (eval '(cons 1 (cons 2 nil)))
(1 2)
exit
(exit)
退出解释器。在网页解释器中,这不起作用。
load
(load <filename>)
加载 filename 文件的内容并求值其中的代码。
filename 必须是符号。如果找不到该文件,将尝试 filename.scm。
网页解释器目前不支持 load。
newline
(newline)
打印一个换行符。
print
(print <val>...)
打印每个 val 的 Scheme 表示,用空格分隔。与 display 不同,
这将包括 Scheme 字符串上的外部引号,以及一个换行符。
类型检查
atom?
(atom? <arg>)
如果 arg 是布尔值、数字、符号、字符串或 nil,返回真;
否则返回假。
boolean?
(boolean? <arg>)
如果 arg 是布尔值,返回真;否则返回假。
integer?
(integer? <arg>)
如果 arg 是整数,返回真;否则返回假。
list?
(list? <arg>)
如果 arg 是格式良好的列表(即它不包含流),返回真;
否则返回假。如果列表有循环,这可能会导致错误或无限循环。
示例:
scm> (list? '(1 2 3))
#t
scm> (list? (cons-stream 1 nil))
#f
number?
(number? <arg>)
如果 arg 是数字,返回真;否则返回假。
null?
(null? <arg>)
如果 arg 是 nil(空列表),返回真;否则返回假。
pair?
(pair? <arg>)
如果 arg 是序对,返回真;否则返回假。
procedure?
(procedure? <arg>)
如果 arg 是过程,返回真;否则返回假。
promise?
(promise? <arg>)
如果 arg 是承诺,返回真;否则返回假。
string?
(string? <arg>)
如果 arg 是字符串,返回真;否则返回假。
symbol?
(symbol? <arg>)
如果 arg 是符号,返回真;否则返回假。
序对和列表操作
append
(append [lst] ...)
返回将所有 lst 的项按顺序附加到单个列表中的结果。
如果没有 lst,返回 nil。
示例:
scm> (append '(1 2 3) '(4 5 6))
(1 2 3 4 5 6)
scm> (append)
()
scm> (append '(1 2 3) '(a b c) '(foo bar baz))
(1 2 3 a b c foo bar baz)
scm> (append '(1 2 3) 4)
Error
car
(car <pair>)
返回 pair 的 car。如果 pair 不是序对,报错。
cdr
(cdr <pair>)
返回 pair 的 cdr。如果 pair 不是序对,报错。
cons
(cons <first> <rest>)
返回一个以 first 作为 car、rest 作为 cdr 的新序对。
length
(length <arg>)
返回 arg 的长度。如果 arg 不是列表,这将导致错误。
list
(list <item> ...)
返回一个以 item 按顺序作为其元素的列表。
map
(map <proc> <lst>)
返回通过在 lst 中的每个项上调用 proc(一个单参数过程)
构造的列表。
filter
(filter <pred> <lst>)
返回仅由在调用 pred(一个单参数过程)时返回真的 lst 的元素组成的列表。
reduce
(reduce <combiner> <lst>)
返回使用 combiner(一个双参数过程)顺序组合 lst 中每个元素的结果。
reduce 从左到右工作,将已有的组合值作为第一个参数传递,
将新值作为第二个参数。lst 必须包含至少一个项。
变异
set-car!
此内置过程包含在教职员解释器和网页解释器中,但不在课程范围内,也不包含在项目中。
(set-car! <pair> <value>)
将 pair 的 car 设置为 value。pair 必须是序对。
set-cdr!
此内置过程包含在教职员解释器和网页解释器中,但不在课程范围内,也不包含在项目中。
(set-cdr! <pair> <value>)
将 pair 的 cdr 设置为 value。pair 必须是序对。
算术运算
strong>+
(+ [num] ...)
返回所有 num 的和。如果没有,返回 0。如果任何 num 不是数字,这将报错。
-
(- <num> ...)
如果只有一个 num,返回它的负数。否则,返回第一个 num 减去剩余 num 的和。
如果任何 num 不是数字,这将报错。
*
(* [num] ...)
返回所有 num 的乘积。如果没有,返回 1。如果任何 num 不是数字,这将报错。
/
(/ <dividend> [divisor] ...)
如果没有 divisor,返回 1 除以 dividend。否则,返回 dividend 除以 divisors 的乘积。
此内置过程执行真除法,不是地板除法。dividend 和所有 divisor 必须是数字。
示例:
scm> (/ 4)
0.25
scm> (/ 7 2)
3.5
scm> (/ 16 2 2 2)
2
abs
(abs <num>)
返回 num 的绝对值,它必须是数字。
expt
(expt <base> <power>)
返回 base 的 power 次幂。两者都必须是数字。
modulo
(modulo <a> <b>)
返回 a 模 b。两者都必须是数字。
示例:
scm> (modulo 7 3)
1
scm> (modulo -7 3)
2
quotient
(quotient <dividend> <divisor>)
返回 dividend 整除 divisor 的结果。两者都必须是数字。
示例:
scm> (quotient 7 3)
2
remainder
(remainder <dividend> <divisor>)
返回 dividend 整除 divisor 时产生的余数。
两者都必须是数字。当涉及负数时,行为与 modulo 不同。
示例:
scm> (remainder 7 3)
1
scm> (remainder -7 3)
-1
其他数学过程
基于 Python 的解释器添加了以下额外过程,其行为与 math 模块中相应的 Python 函数完全匹配。
- acos
- acosh
- asin
- asinh
- atan
- atan2
- atanh
- ceil
- copysign
- cos
- cosh
- degrees
- floor
- log
- log10
- log1p
- log2
- radians
- sin
- sinh
- sqrt
- tan
- tanh
- trunc
布尔运算
通用
eq?
(eq? <a> <b>)
如果 a 和 b 都是数字、布尔值或符号,如果它们等价则返回真;
否则返回假。
否则,如果 a 和 b 都引用内存中的同一个对象,则返回真;
否则返回假。
示例:
scm> (eq? '(1 2 3) '(1 2 3))
#f
scm> (define x '(1 2 3))
scm> (eq? x x)
#t
equal?
(equal? <a> <b>)
如果 a 和 b 等价,返回真。对于两个序对,如果它们的 car 等价且它们的 cdr 等价,则它们等价。
示例:
scm> (equal? '(1 2 3) '(1 2 3))
#t
not
(not <arg>)
如果 arg 是假值返回真,如果 arg 是真值返回假。
在数字上
=
(= <a> <b>)
如果 a 等于 b 返回真。两者都必须是数字。
<
(< <a> <b>)
如果 a 小于 b 返回真。两者都必须是数字。
>
(> <a> <b>)
如果 a 大于 b 返回真。两者都必须是数字。
<=
(<= <a> <b>)
如果 a 小于或等于 b 返回真。两者都必须是数字。
>=
(>= <a> <b>)
如果 a 大于或等于 b 返回真。两者都必须是数字。
even?
(even? <num>)
如果 num 是偶数返回真。num 必须是数字。
odd?
(odd? <num>)
如果 num 是奇数返回真。num 必须是数字。
zero?
(zero? <num>)
如果 num 是零返回真。num 必须是数字。
承诺和流
force
此内置过程包含在教职员解释器和网页解释器中,但不在课程范围内,也不包含在项目中。
(force <promise>)
返回 promise 的求值结果。如果 promise 已经被强制,
它的表达式将不会再次求值。相反,将返回前一次求值的结果。
promise 必须是承诺。
cdr-stream
此内置过程包含在教职员解释器和网页解释器中,但不在课程范围内,也不包含在项目中。
(cdr-stream <stream>)
(force (cdr <stream>)) 的简写。
海龟绘图
backward
(backward <n>)
或者,
(back <n>)
或者,
(bk <n>)
使海龟从其当前位置沿其当前方向向后移动 n 个单位。
begin_fill
(begin_fill)
开始一系列描绘要填充的形状的移动。
调用 end_fill 完成填充。
bgcolor
(bgcolor <c>)
将海龟窗口的背景颜色设置为颜色 c(与调用 color 时相同的规则)。
circle
(circle <r> [extent])
绘制一个半径为 r 的圆,中心在海龟左侧 r 个单位处。
如果 extent 存在,只绘制圆的前 extent 度。
如果 r 为正,沿逆时针方向绘制。否则,沿顺时针方向绘制。
clear
(clear)
清除绘图,保持海龟不变。
color
(color <c>)
将画笔颜色设置为 c,这是一个 Scheme 字符串,如 "red" 或 "#ffc0c0"。
end_fill
(end_fill)
填充自上次调用 begin_fill 以来绘制的形状。
exitonclick
(exitonclick)
在 pillow-turtle 模式下,这将退出当前程序。在 tk-turtle 模式下,当窗口被点击时退出当前程序。 在网页解释器中,它不起作用。
在本地解释器中,你可以传递 --turtle-save-path PATH 来在退出之前有效地调用 (save-to-file PATH)。
forward
(forward <n>)
或者,
(fd <n>)
使海龟从其当前位置沿其当前方向向前移动 n 个单位。
hideturtle
(hideturtle)
或者,
(ht)
使海龟不可见。
left
(left <n>)
(lt <n>)
将海龟的方向逆时针旋转 n 度。
pendown
(pendown)
或者,
(pd)
降低画笔,使海龟开始绘图。
penup
(penup)
或者,
(pu)
抬起画笔,使海龟不绘图。
pixel
(pixel <x> <y> <c>)
绘制一个从 (x, y) 开始用颜色 c 填充像素的框(与 color 中相同的规则)。
默认情况下框是一个像素,但这可以通过 pixelsize 更改。
pixelsize
(pixelsize <size>)
将 pixel 绘制的框的大小更改为 sizexsize。
rgb
(rgb <r> <g> <b>)
返回由 0 到 1 之间的 r、g 和 b 值形成的颜色字符串。
right
(right <n>)
(rt <n>)
将海龟的方向顺时针旋转 n 度。
save-to-file
(save-to-file <f>)
将当前画布保存到由 f 指定的文件,并添加文件扩展名。
例如,(save-to-file "hi")
- 在使用 pillow-turtle 的本地解释器中保存到
./hi.png - 在使用 tk-turtle(默认)的本地解释器中保存到
./hi.ps - 在网页解释器中没有效果
screen_width
(screen_width)
返回当前大小的海龟屏幕宽度(以像素为单位)。
screen_height
(screen_height)
返回当前大小的海龟屏幕高度(以像素为单位)。
setheading
(setheading <h>)
(seth <h>)
将海龟的方向设置为从北顺时针 h 度。
setposition
(setposition <x> <y>)
或者,
(setpos <x> <y>)
或者,
(goto <x> <y>)
将海龟移动到位置 (x, y),不改变其方向。
showturtle
(showturtle)
(st)
使海龟可见。
speed
(speed <s>)
将海龟的动画速度设置为 0 到 10 之间的某个值,0 表示无动画, 1-10 表示越来越快的运动。
在 tk-turtle 模式的本地解释器上,这会更改动画速度。 此功能对网页解释器和无 GUI 的 pillow-turtle 模式没有效果。