88
99脚本模式中有两类核心复合字面量。一曰「数组」,一曰「字典」。
1010
11- 「数组」是按照顺序存储的一些「值」,你可以在「数组」中存放*任意内容* 而不拘泥于类型 。你可以使用圆括号与一个逗号分隔的列表创建一个*数组字面量* :
11+ 「数组」是按照顺序存储的一些「值」,你可以在「数组」中存放*任意内容* 而不受类型限制 。你可以使用圆括号与一个逗号分隔的列表创建一个*数组字面量* :
1212
1313# code (```typ
1414#(1, "OvO", [一段内容])
1515``` )
1616
1717== 字典字面量 <grammar-dict-literal>
1818
19- 所谓「字典」即是「键值对」的集合,其每一项是由冒号分隔的「键值对」。如下例所示,冒号左侧,“neco -mimi”等「标识符」或「字符串」是字典的「键」,而冒号右侧分别是对应的「值」。
19+ 所谓「字典」即是「键值对」的集合,其每一项是由冒号分隔的「键值对」。如下例所示,冒号左侧,“neko -mimi”等「标识符」或「字符串」是字典的「键」,而冒号右侧分别是对应的「值」。
2020
2121# code (```typ
2222#(neko-mimi: 2, "utterance": "喵喵喵")
2323``` )
2424
2525== 数组和字典的典型构造
2626
27- 特别讲解一些关于数组与字典相关的典型构造 :
27+ 下面特别讲解一些与数组和字典相关的典型构造 :
2828
2929# code (```typ
3030#() \ // 是空的数组
3131#(:) \ // 是空的字典
3232#(1) \ // 被括号包裹的整数1
3333#(()) \ // 被括号包裹的空数组
34- #((())) \ // 被括号包裹的被括号包裹的空数组
34+ #((())) \ // 被两层括号包裹的空数组
3535#(1,) \ // 是含有一个元素的数组
3636``` )
3737
3838`()` 是空的数组<grammar-empty-array> ,不含任何值。`(:)` 是空的字典<grammar-empty-dict> ,不含任何键值对。
3939
4040如果括号内含了一个值,例如`(1)` ,那么它仅仅是被括号包裹的整数1,仍然是整数1本身。
4141
42- 类似的 ,`(())` 是被括号包裹的空数组<grammar-paren-empty-array> ,`((()))` 是被括号包裹的被括号包裹的空数组 。
42+ 类似地 ,`(())` 是被括号包裹的空数组<grammar-paren-empty-array> ,`((()))` 是被两层括号包裹的空数组 。
4343
4444为了构建含有一个元素的数组,需要在列表末尾额外放置一个逗号以示区分,例如`(1,)` 。<grammar-single-member-array>
4545
4646// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Trailing_commas
47- 这种逗号被称为尾后逗号 。
47+ 这种逗号被称为尾随逗号 。
4848
4949// todo: 改进
50- 构造数组字面量时,允许尾随一个多余的逗号而不造成影响 。
50+ 构造数组字面量时,允许在末尾保留一个多余的逗号而不造成影响 。
5151
5252# code (```typ
5353#let x = (1, "OvO", [一段内容] , ); #x
5454// 这里有一个多余的逗号^^^
5555``` )
5656
57- 构造字典字面量时,允许尾随一个多余的逗号 。
57+ 构造字典字面量时,也允许在末尾保留一个多余的逗号 。
5858
5959# code (```typ
6060#let cat = (attribute: [kawaii\~], ); #cat
6565
6666这是本节最难的内容,非程序员朋友想要灵活运用可能有点困难。
6767
68- 除了使用字面量「构造」元素,Typst还支持「构造」的反向操作:「解构赋值」。顾名思义,你可以在左侧用相似的语法从数组 <grammar-destruct-array> 或字典中获取值并赋值到 *对应* 的变量上。<grammar-destruct-dict>
68+ 除了使用字面量「构造」元素,Typst还支持「构造」的反向操作:「解构赋值」。顾名思义,你可以在左侧使用相似的语法从数组 <grammar-destruct-array> 或字典中获取值,并赋值到 *对应* 的变量上。<grammar-destruct-dict>
6969
7070# code (```typ
7171#let (attr: a) = (attr: [kawaii\~])
7272#a
7373``` )
7474
75- 「解构赋值」必须一一对应,但你也可以使用「占位符」(`_` )或「延展符」(`..` )以作 *部分* 解构:<grammar-destruct-array-eliminate>
75+ 「解构赋值」必须一一对应,但你也可以使用「占位符」(`_` )或「延展符」(`..` )做 *部分* 解构:<grammar-destruct-array-eliminate>
7676
7777# code (```typ
7878#let (first, ..) = (1, 2, 3)
7979#let (.., second-last, _) = (7, 8, 9, 10)
8080#first, #second-last
8181``` )
8282
83- 数组的「解构赋值」有一个妙用,那就是重映射内容 。<grammar-array-remapping>
83+ 数组的「解构赋值」有一个妙用,那就是重映射变量 。<grammar-array-remapping>
8484
8585# code (```typ
8686#let (a, b, c) = (1, 2, 3)
9696
9797== 数组和字典的成员访问
9898
99- 为了访问数组 ,你可以使用`at` 方法。“at”在中文里是“在”的意思,它表示对「数组」使用「索引」操作。`at(0)` 索引到第1个值,`at(n)` 索引到第 $ n + 1$ 个值,以此类推。如下所示:
99+ 要访问数组元素 ,你可以使用`at` 方法。“at”在中文里是“在”的意思,它表示对「数组」使用「索引」操作。`at(0)` 索引到第1个值,`at(n)` 索引到第 $ n + 1$ 个值,以此类推。如下所示:
100100
101101# code (```typ
102102#let x = (1, "OvO", [一段内容])
105105
106106至于「索引」从零开始的原因,这只是约定俗成。等你习惯了,你也会变成计数从零开始的好程序员。
107107
108- 为了访问字典 ,你可以使用`at` 方法。但由于「键」都是字符串,你需要使用字符串作为字典的「索引」。
108+ 要访问字典中的值 ,你可以使用`at` 方法。但由于「键」都是字符串,你需要使用字符串作为字典的「索引」。
109109
110110# code (```typ
111111#let cat = (attribute: [kawaii\~])
112112#cat.at("attribute")
113113``` )
114114
115- 为了方便,Typst允许你直接通过成员方法访问字典对应 「键」的值: <grammar-dict-member-exp>
115+ 为了方便,Typst允许你直接通过成员语法访问字典对应 「键」的值: <grammar-dict-member-exp>
116116
117117# code (```typ
118118#let cat = ("attribute": [kawaii\~])
121121
122122== 数组和字典的「存在谓词」
123123
124- 为了访问数组 ,你可以使用`contains` 方法。“contain”在中文里是“包含”的意思,如下所示:
124+ 要判断数组中是否包含某个值 ,你可以使用`contains` 方法。“contain”在中文里是“包含”的意思,如下所示:
125125
126126# code (```typ
127127#let x = (1, "OvO", [一段内容])
128128#x.contains[一段内容]
129129``` )
130130
131- 因为这太常用了,typst专门提供了 `in` 语法,表示判断`x` 是否*存在于* 某个数组中:<grammar-array-in>
131+ 因为这太常用了,Typst专门提供了 `in` 语法,表示判断`x` 是否*存在于* 某个数组中:<grammar-array-in>
132132
133133# code (```typ
134134#([一段内容] in (1, "OvO", [一段内容])) \
135135#([另一段内容] in (1, "OvO", [一段内容]))
136136``` )
137137
138- 字典也可以使用此语法,表示判断`x` 是否是字典的一个「键」。特别地,你还可以前置一个 `not` 判断`x` 是否*不在* 某个数组或字典中:<grammar-dict-in>
138+ 字典也可以使用此语法,表示判断`x` 是否是字典的一个「键」。特别地,你还可以在前面加一个 `not` , 判断`x` 是否*不在* 某个数组或字典中:<grammar-dict-in>
139139
140140# code (```typ
141141#let cat = (neko-mimi: 2)
142142#("neko-kiki" not in cat)
143143``` )
144144
145- 注意:`x in (...)` 与`"x" in (...)` 是不同的。例如`neko-mimi in cat` 将检查`neko-mimi` 变量的内容是否是字典变量`cat` 的一个「键」,而`"neko-mimi"` 检查对应字符串是否在其中 。
145+ 注意:`x in (...)` 与`"x" in (...)` 是不同的。例如`neko-mimi in cat` 将检查`neko-mimi` 变量的内容是否是字典变量`cat` 的一个「键」,而`"neko-mimi" in cat` 则检查对应字符串是否在其中 。
146146
147147// field access
148148// - dictionary
152152
153153== 位置参数声明 <grammar-positional-param>
154154
155- typst通过数组和字典在执行时向函数传递参数。上一节我们学会了基本的函数声明 ,若进一步理解了数组和字典,可以定义更复杂的函数。接下来我们讲透Typst中如何声明复杂函数 ,以及如何调用函数。
155+ Typst通过数组和字典的形式在执行时向函数传递参数。上一章我们学会了基本的函数声明 ,若进一步理解了数组和字典,就可以定义更复杂的函数。接下来我们讲讲Typst中如何声明复杂函数 ,以及如何调用函数。
156156
157157其中最简单的是位置参数声明,我们在上节已经学过。
158158
@@ -161,11 +161,11 @@ typst通过数组和字典在执行时向函数传递参数。上一节我们学
161161#f(1, 2)
162162``` )
163163
164- 在函数调用的时候,位置参数必须按照声明的顺序传递。例子中,向`f` 函数传递了两个位置参数`1` 和`2` ,于是`a` 和`b` 作为变量被赋值为了 `1` 和`2` ,接着这个函数返回一个「内容块」,其中用到了`a` 和`b` 变量。
164+ 在函数调用的时候,位置参数必须按照声明的顺序传递。例子中,向`f` 函数传递了两个位置参数`1` 和`2` ,于是`a` 和`b` 作为变量被赋值为 `1` 和`2` ,接着这个函数返回一个「内容块」,其中用到了`a` 和`b` 变量。
165165
166166== 具名参数声明 <grammar-named-param>
167167
168- 函数可以包含「具名参数」,其看起来就像字典的一项 ,冒号右侧则是参数的*默认值* :
168+ 函数可以包含「具名参数」,看起来就像字典的一项 ,冒号右侧则是参数的*默认值* :
169169
170170# code (```typ
171171#let g(name: "?") = [你是#name]
@@ -187,7 +187,7 @@ typst通过数组和字典在执行时向函数传递参数。上一节我们学
187187
188188== 参数类型 <grammar-param-literal>
189189
190- 什么是「参数类型」(argument type)?在typst中 ,你完全可以先把函数参数准备好,然后直接调用函数:
190+ 什么是「参数类型」(argument type)?在Typst中 ,你完全可以先把函数参数准备好,然后直接调用函数:
191191
192192# code (```typ
193193#let sum(..args, init: 0) = init + args.pos().sum()
@@ -197,7 +197,7 @@ typst通过数组和字典在执行时向函数传递参数。上一节我们学
197197
198198`arguments` 是一个类型,`arguments(1, 2)` 是一个表达式,它返回一个`arguments` 类型的值。
199199
200- 也可以预先传递参数 ,然后直接调用函数:
200+ 也可以预先准备参数 ,然后直接调用函数:
201201
202202# code (```typ
203203#let sum(..args, init: 0) = init + args.pos().sum()
@@ -241,7 +241,7 @@ typst通过数组和字典在执行时向函数传递参数。上一节我们学
241241#first-and-last(("开头", "中间", "结尾"))
242242``` )
243243
244- 如果你希望保留字典中剩下的项目,也可以把 `..` 后接一个变量名:
244+ 如果你希望保留字典中剩下的项目,也可以在 `..` 后接一个变量名:
245245
246246# code (```typ
247247#let describe((name, ..other)) = [#name:#repr(other)]
0 commit comments