TerraScript 格式
TerraScript 的格式与 JavaScript 及基于 C 的语言相似。如果你接触过这些代码,那么使用 TerraScript 会很方便。如果没有也不必担心,TerraScript 非常便于学习!
函数
函数是一种利用传入的参数执行操作的语句,会返回一个(可选的)值。
函数基础
TerraScript 中的函数格式大致如下:
函数(参数甲, 参数乙);
函数
即为函数的 标识符
(函数名称)。
参数甲
与 参数乙
即为函数的参数(传入函数的数据)。
信息
TerraScript 函数相关的文档可以在这里浏览。
返回类型
每个函数都有返回类型,如 void
、num
、str
或 bool
。
返回即表示函数执行代码完毕后“传出”的值。这个值既可忽略,也可用于表达式,如变量分配,比较,甚至调用其他函数。
- 返回类型为
num
、str
或bool
表示其返回数字、字符串或布尔值。只要类型符合要求,它可以用在任何需要的表达式中。 - 返回类型为
void
表示其不返回任何值。void
类型的函数不可以用在需要返回值的表达式中。
表达式
表达式是一系列对数据的运算并产生结果的语句。
比如 5 + 3 * 2
,即 11
。
类型
类型即为 TerraScript 中数据要求或提供的“类型”。TerraScript 中的每个表达式都有其类型。除此之外,TerraScript 是静态类型语言,即数据类型在判断时检查,而非代码运行时。这表示你无需在运行时担心类型问题。
Terra 有 3 中数据类型,先前已有简略介绍:
num
- 数字值。数字可以是整数或小数(浮点数)。可以通过比较运算符与其他数字进行大小比对。bool
- 布尔值。它只能为 true(真、是)或 false(假、否)。可以通过布尔比较符与其他布尔值进行逻辑比对。str
- 字符串值。顾名思义,它是一串字符,如"你好, 世界!"
。可以通过等于和不等号与其他字符串进行比较。
(技术层面,void
不是类型,它仅仅表明函数不返回任何值。)
常量表达式
常量是一系列值和类型均固定的表达式。
str
常量通常被引号包裹:"这是一条常量字符串"
。num
常量就是数字:0
、1
、20.3
以及42.0
。bool
常量就是关键词true
或false
。
复合表达式
符合表达式是一系列通过运算符号连缀的常量。TerraScript 提供了许多可以处理不同类型的运算符号。
运算符
运算符可以对一或多个数据进行处理。
+
- 二值相加。-
- 二值相减,顺序为左减右。*
- 二值相乘。/
- 二值相除,顺序为左除以右。%
- 二值相除,取余值,顺序为左余除右。
布尔运算符
&&
- 布尔值“和”运算(左右均为 true,才返回 true)。||
- 布尔值“或”运算(左右有一个 true,即返回 true)。
比较运算符
>
- 小于符号 - 比较两个数。<
- 大于符号 - 比较两个数。>=
- 小于等于符号 - 比较两个数。<=
- 大于等于符号 - 比较两个数。==
- 等于 - 类型不限。!=
- 不等于 - 类型不限。
一元运算符
!
- 布尔值“非”运算(!true
的结果是false
,而!false
的结果是true
)。-
- 取负值。(-(1)
的结果是-1
,而-(-1)
的结果则是1
)。
函数
可以返回表达式的函数!函数的返回值可以嵌入更复杂的表达式,只需像这样将函数放入表达式:
randomInt(5) * 2 > 3; // 取 0 到 5 之间的一个随机数,如果它乘以 2 的值大于 3,那么返回 true。
变量
变量用于存储数据。它们通过称为标识符的名称声明,可以用于值的分配与引用。
声明
创建变量之前必须声明它。Terra 中的变量声明格式固定:
类型 名称 = 值;
类型
即为变量的类型,可以是str
、bool
或num
。名称
即为读取变量时使用的名称。值
即为分配给变量的值。变量的值必须匹配声明的类型。
示例:
num aNumber = 0; // 声明一个数字变量,名称为 aNumber,值为 0.
str example = "hello, world"; // 声明一个字符串变量,名称为 example,值为 "hello, world"。
bool condition = false; // 声明一个布尔值变量,名称为 condition,值为 false。
引用
值可以在表达式中引用。若要引用变量,只需将其变量放入表达式即可。变量即代表其值。例如:
num number = 3;
print("数字:" + number); // 输出数字 3
赋值
变量的值可以通过赋值改变。声明变量就需要给它初始赋值。如果需要在声明变量后重新为其赋值,则需要按 变量名称 = 值
的格式编写代码。你不能重复定义变量,只能重复分配它们。例如:
num aNumber = 0;
print("Number: " + number); // 输出数字 0
aNumber = 3;
print("Number: " + number); // 输出数字 3
值声明后初始值为 0
。输出第一次值之后,它的值被重新分配为 3
。你甚至可以在重分配变量时引用它自身的值:
num aNumber = 4;
print("Number: " + number); // 输出数字 4
aNumber = aNumber - 1; // 将 aNumber 的值设置为它本身减去 1。
print("Number: " + number); // 输出数字 3
条件语句
if
if 条件语句会在条件为 true 时执行它之中的代码。
if(condition) {
print("条件为 true");
}
在如上示例中,print
函数只会在 condition
为 true 时执行。假设 condition
是 bool
类型的数据。判断器中不能传入其他类型的数据。
比较
搭配比较语句的 if 条件语句潜力无穷。TerraScript 支持六种比较运算符,见上表。
这些比较符都是二元运算符,即它必须比较两个参数(或表达式)。
例如,5 > 1
会返回 true
。
等于和不等于号可以用在任何类型的数据上。但其他的运算符只能用于比较两个 num
类型的数据。
将其与 if 条件语句结合,我们会得到如下代码:
if(5 > 1) {
print("条件为 true");
}
这还不是很有用。这条件只会返回 true!如果我把它与 randomInt
结合使用呢?
if(randomInt(2) == 0) {
print("这条消息有一半的概率显示!");
}
引入外部条件之后,脚本可以在不同的情况下有着不同的结果。如果我们想要某样东西有一半几率返回甲,而剩下几率返回乙该怎么做?我们可以这样实现:
num randomNumber = randomInt(2);
if(randomNumber == 0) {
print("这条消息有一半的概率显示!");
}
if(randomNumber == 1) {
print("这条消息有另一半的概率显示!");
}
这非常不优雅。有一种更简洁且可读的方式实现相同的功能,即 else
语句。else
需要跟在 if
之后,用以表示 if
中的代码没有被执行时,之后执行的内容。用 else
重写上述的代码以后,它看起来像这样:
if(randomInt(2) == 0) {
print("这条消息有一半的概率显示!");
} else {
print("这条消息有另一半的概率显示!");
}
这比之前的代码更清晰了。我们还可以进一步将其压缩,因为每块代码都只包含一条表达式,因此可以简化为:
if(randomInt(2) == 0) print("这条消息有一半的概率显示!");
else print("这条消息有另一半的概率显示!");
注意我们省略了花括号。只有条件或循环中仅存在一条表达式,才可以省略这些。
else if
好吧,如果我们还想要更多条件怎么办?我们可以通过 else if
条件语句添加更多条件。它们会按序判断,会在其中一条为 true 时停止。
num randomNumber = randomInt(3);
if(randomNumber == 0) print("这条消息有三分之一的概率显示!");
else if(randomNumber == 1) print("剩下三分之一的概率显示这条消息!");
else if(randomNumber == 2) print("最后三分之一的概率显示这条消息!");
通过 else if
条件语句,我们可以让脚本更加简洁可读。else if
也可以搭配 else
使用,就像这样:
num randomNumber = randomInt(3);
if(randomNumber == 0) print("这条消息有三分之一的概率显示!");
else if(randomNumber == 1) print("剩下三分之一的概率显示这条消息!");
else print("最后三分之一的概率显示这条消息!");
循环
可以基于某个条件,重复运行某段代码。
while 循环
最简单的循环就是 while 循环。它需要在声明时传入一个布尔值表达式,称作条件。循环中声明的代码会在条件为 true 时一直执行。例如:
while(true) { // 因为条件总是 true,代码块将会无限循环。你应当避免这样的情况。
print("这会一直循环!");
}
在这个示例中的循环会一直执行,这肯定不是我们想要的。
num aNumber = 0;
while(number < 5) { // 这个循环将会持续执行到 aNumber 不小于 5(大于或等于 5).
print("数字: " + aNumber);
aNumber = aNumber + 1; // 每次循环时都将 aNumber 的值加一。
}
这个循环会重复执行五次。控制台会显示这些信息:
数字:0
数字:1
数字:2
数字:3
数字:4
for 循环
for 循环与 while 循环相似,但它需要三个参数。例如:
for(num x = 0; x < 5; x = x + 1) {
print("数字:" + aNumber);
}
这段 for 循环的功能与上述的 while 循环相似;它会输出 0 到 4 的数字。它可以用自然语言描述为:“声明一个叫做 X 的变量,只要 X 小于 5 就会循环,每次循环 X 的值加 1”。
for 循环表达式
初始值
for 循环中的首个表达式即为初始值。通常它声明的是变量。在这种情况中,这个变量只能在 for 循环中使用。一个例子就是上述示例中的 num x = 0
,它声明了一个可以在代码循环中使用的变量 x
。
条件
第二个表达式即为条件。它与 while 循环中的条件相似;循环将会在它为 true 时一直执行代码,当它为 false 时就会停止。通常情况下,如果初始值中声明了一个变量,那么条件通常会填入一个表达式。在上述示例中,检查的条件即为 x
是否小于 5。
增量
第三个表达式即为增量。增量会在每个循环遍历的最后,在所有代码执行完毕后,下一次条件检查之前触发。通常情况下,增量用于增加变量的值。在上述示例中,增量会在每次遍历后将 x
的值加 1。
流控制
返回
return
关键词会以“传出”状态结束。它可以用在 base 代码块,或者循环中。例如:
print("这条消息会输出!");
return; // 在这里终止代码
print("这条消息永远不会输出!");
如上的示例会在输出第一条消息之后以“传出”状态退出。第二条消息永远不会被输出。
失败
fail
关键词会以“错误”状态结束。它可以用在 base 代码块,或者循环中。例如:
print("这条消息会输出!");
fail; // 在这里终止代码
print("这条消息永远不会输出!");
上述示例会在输出第一条消息之后以“错误”状态退出。第二条消息永远不会被输出。
需要注意的是,return
和 fail
都是级联,意味着如果它们被用在循环中,会立即跳出所有父循环并终止脚本。
终止
break
关键词会立即停止当前循环。他会立即退出循环,回到上一级循环。它是一个循环控制关键词,因此只能用在循环里。示例:
num aNumber = 0;
while(true) { // 通常情况下循环会无限执行。
if(aNumber > 5) break; // 如果 aNumber 大于 5,则立即退出循环。
print("Number:" + aNumber);
aNumber = aNumber + 1;
}
上述循环会执行到 aNumber 大于 5 的时候,然后退出并执行脚本的剩余代码。
继续
continue
关键词会立即停止当前循环的遍历,回到循环开头,然后进入下一次循环(如果满足条件)。示例:
num aNumber = 0;
while(aNumber <= 5) { // 通常情况下循环会无限执行。
aNumber = aNumber + 1;
print("数字:" + aNumber);
if(aNumber > 2) continue; // 如果 aNumber 大于 2,则立即回到代码顶部。
print("小于 2");
}
上述代码会执行到 aNumber
大于 5 为止,会在每次它的值小于 2 时输出“小于 2”。