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>)

如果 argnil(空列表),返回真;否则返回假。

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>)

返回 paircar。如果 pair 不是序对,报错。

cdr
(cdr <pair>)

返回 paircdr。如果 pair 不是序对,报错。

cons
(cons <first> <rest>)

返回一个以 first 作为 carrest 作为 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>)

paircar 设置为 valuepair 必须是序对。

set-cdr!

此内置过程包含在教职员解释器和网页解释器中,但不在课程范围内,也不包含在项目中。

(set-cdr! <pair> <value>)

paircdr 设置为 valuepair 必须是序对。

算术运算

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>)

返回 basepower 次幂。两者都必须是数字。

modulo
(modulo <a> <b>)

返回 ab。两者都必须是数字。

示例:

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>)

如果 ab 都是数字、布尔值或符号,如果它们等价则返回真; 否则返回假。

否则,如果 ab 都引用内存中的同一个对象,则返回真; 否则返回假。

示例:

scm> (eq? '(1 2 3) '(1 2 3))
#f
scm> (define x '(1 2 3))
scm> (eq? x x)
#t
equal?
(equal? <a> <b>)

如果 ab 等价,返回真。对于两个序对,如果它们的 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 之间的 rgb 值形成的颜色字符串。

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 模式没有效果。

补充阅读