Foundations¶
Arguments¶
自定义函数也如内嵌函数一样可以接收可变长度的参数,以 ..sink
形式指明参数接收器接收额外的参数. 接收器的值是 arguments
类型,其提供了一系列方法访问位置和命名参数.
而与参数接收相反,也可以通过运算符 ..spread
进行参数传播,可传播类型包括参数,数组和字典.
参数的构造函数可以用于构造合适的可传播参数,行为类似 let args(..sink) = sink
.
-
at
函数返回指定索引的位置参数,或指定键的命名参数. 如果键值是整数,则相当于先调用pos
函数再调用array.at
函数. 而如果键值是字符串,则相当于先调用named
函数再调用dictionary.at
函数. -
pos
函数以数组形式返回捕捉的位置参数. -
named
函数以字典形式返回捕捉的命名参数.
Example
对于
而言,args.pos()
返回 ([Body],)
,args.named()
返回 (stroke: rgb("#ff4136"), inset: 1em)
.
Array¶
数组是一种有序的集合,其元素可以是任意类型. 索引从零开始,负索引从数组末尾回绕.
长度为 1 的数组需要一个尾逗号,以消除与括号运算符的歧义.
数组的构造函数可以将值转换为数组,不过该函数意图在于将集合类的值转换为数组,对于独立的值,可以直接使用数组的语法.
-
len
函数返回数组元素个数. -
first
函数返回数组的第一个元素. -
last
函数返回数组的最后一个元素. -
at
函数返回指定索引的元素. 如果索引超过了数组范围,则返回默认值. -
push
函数将元素添加到数组末尾. -
pop
函数移除并返回数组的最后一个元素. -
insert
函数在指定索引处插入元素,并且将后续元素向后移动. 替换元素的话使用at
函数. -
remove
函数移除指定索引的元素,并且返回该元素. -
slice
函数提取数组的子数组.end
参数与count
参数互斥. -
contains
函数检查数组是否包含指定元素,其也有专门的语法,比如可以用2 in (1, 2, 3)
代替(1, 2, 3).contains(2)
. -
find
函数用来查找符合条件的元素,如果找到则返回第一个匹配的元素,否则返回none
.Example
#(1, 2, 3).find(calc.even)
返回2
. -
position
函数用来查找符合条件的元素,如果找到则返回第一个匹配的索引,否则返回none
. -
range
创建一个整数数组,其范围从start
到end
,步长为step
. 只传入一个参数的话,其作为end
参数,start
参数默认为 0,step
参数默认为 1. 传入两个参数的话,第一个参数作为start
参数,第二个参数作为end
参数,step
参数默认为 1. -
filter
函数用来创建一个新数组,其中只包含符合条件的元素. -
map
函数用来创建一个新数组,其中的元素是原数组元素经过函数处理后的结果. -
enumerate
函数用来创建一个新数组,其中的元素是原数组元素及其索引的数组,索引从start
开始. -
zip
函数用来创建一个新数组,其中的元素是多个数组对应位置的元素的数组. 如果exact
参数为true
,则强制所有数组长度相等,否则出错. -
fold
函数使用累加器和数组的元素折叠为一个值. -
sum
函数返回数组元素的和. -
product
函数返回数组元素的积. -
any
函数检查数组是否有元素符合条件. -
all
函数检查数组是否所有元素都符合条件. -
flatten
函数将多维数组转换为一维数组. -
rev
函数将数组元素反转. -
split
函数将数组在对应值处进行分割,得到多维数组. -
join
函数将数组元素连接为一个元素. -
intersperse
函数将某个元素插入到数组元素之间. -
chunk
函数将数组分割为多个大小相等的数组. 除了最后一个数组外,其它数组都有chunk-size
个元素. 如果exact
参数为true
,则在最后一个数组长度不足时将其丢弃,否则保留. -
windows
函数返回数组上所有window-size
大小的滑动窗口构成的数组. -
sorted
函数返回依据键函数排序的数组. -
dedup
函数返回去重后的数组. -
to-dict
函数将数组转换为字典,如果一个键值出现了多次,则取最后一个值. -
reduce
函数将元素规约为一个值. 如果数组是空的,返回none
. 当数组至少有一个元素时,其与array.fold
函数的行为类似,不过将第一个值作为累加器的初始值.