Skip to content

TerraScript 格式

TerraScript 的格式与 JavaScript 及基于 C 的语言相似。如果你接触过这些代码,那么使用 TerraScript 会很方便。如果没有也不必担心,TerraScript 非常便于学习!

函数

函数是一种利用传入的参数执行操作的语句,会返回一个(可选的)值。

函数基础

TerraScript 中的函数格式大致如下:

JavaScript
函数(参数甲, 参数乙);

函数 即为函数的 标识符(函数名称)。

参数甲参数乙 即为函数的参数(传入函数的数据)。

信息

TerraScript 函数相关的文档可以在这里浏览。

返回类型

每个函数都有返回类型,如 voidnumstrbool

返回即表示函数执行代码完毕后“传出”的值。这个值既可忽略,也可用于表达式,如变量分配,比较,甚至调用其他函数。

  • 返回类型为 numstrbool 表示其返回数字、字符串或布尔值。只要类型符合要求,它可以用在任何需要的表达式中。
  • 返回类型为 void 表示其不返回任何值。void 类型的函数不可以用在需要返回值的表达式中。

表达式

表达式是一系列对数据的运算并产生结果的语句。

比如 5 + 3 * 2,即 5+3×2,等于 11

类型

类型即为 TerraScript 中数据要求或提供的“类型”。TerraScript 中的每个表达式都有其类型。除此之外,TerraScript 是静态类型语言,即数据类型在判断时检查,而非代码运行时。这表示你无需在运行时担心类型问题。

Terra 有 3 中数据类型,先前已有简略介绍:

  • num - 数字值。数字可以是整数或小数(浮点数)。可以通过比较运算符与其他数字进行大小比对。
  • bool - 布尔值。它只能为 true(真、是)或 false(假、否)。可以通过布尔比较符与其他布尔值进行逻辑比对。
  • str - 字符串值。顾名思义,它是一串字符,如 "你好, 世界!"。可以通过等于和不等号与其他字符串进行比较。

(技术层面,void 不是类型,它仅仅表明函数不返回任何值。)

常量表达式

常量是一系列值和类型均固定的表达式。

  • str 常量通常被引号包裹:"这是一条常量字符串"
  • num 常量就是数字:0120.3 以及 42.0
  • bool 常量就是关键词 truefalse

复合表达式

符合表达式是一系列通过运算符号连缀的常量。TerraScript 提供了许多可以处理不同类型的运算符号。

运算符

运算符可以对一或多个数据进行处理。

  • + - 二值相加。
  • - - 二值相减,顺序为左减右。
  • * - 二值相乘。
  • / - 二值相除,顺序为左除以右。
  • % - 二值相除,取余值,顺序为左余除右。

布尔运算符

  • && - 布尔值“和”运算(左右均为 true,才返回 true)。
  • || - 布尔值“或”运算(左右有一个 true,即返回 true)。

比较运算符

  • > - 小于符号 - 比较两个数。
  • < - 大于符号 - 比较两个数。
  • >= - 小于等于符号 - 比较两个数。
  • <= - 大于等于符号 - 比较两个数。
  • == - 等于 - 类型不限。
  • != - 不等于 - 类型不限。

一元运算符

  • ! - 布尔值“非”运算(!true 的结果是 false,而 !false 的结果是 true)。
  • - - 取负值。(-(1) 的结果是 -1,而 -(-1) 的结果则是 1)。

函数

可以返回表达式的函数!函数的返回值可以嵌入更复杂的表达式,只需像这样将函数放入表达式:

JavaScript
randomInt(5) * 2 > 3; // 取 0 到 5 之间的一个随机数,如果它乘以 2 的值大于 3,那么返回 true。

变量

变量用于存储数据。它们通过称为标识符的名称声明,可以用于值的分配与引用。

声明

创建变量之前必须声明它。Terra 中的变量声明格式固定:

JavaScript
类型 名称 = 值;
  • 类型 即为变量的类型,可以是 strboolnum
  • 名称 即为读取变量时使用的名称。
  • 即为分配给变量的值。变量的值必须匹配声明的类型。

示例:

JavaScript
num aNumber = 0; // 声明一个数字变量,名称为 aNumber,值为 0.

str example = "hello, world"; // 声明一个字符串变量,名称为 example,值为 "hello, world"。

bool condition = false; // 声明一个布尔值变量,名称为 condition,值为 false。

引用

值可以在表达式中引用。若要引用变量,只需将其变量放入表达式即可。变量即代表其值。例如:

JavaScript
num number = 3;
print("数字:" + number); // 输出数字 3

赋值

变量的值可以通过赋值改变。声明变量就需要给它初始赋值。如果需要在声明变量后重新为其赋值,则需要按 变量名称 = 值 的格式编写代码。你不能重复定义变量,只能重复分配它们。例如:

JavaScript
num aNumber = 0;
print("Number: " + number); // 输出数字 0
aNumber = 3;
print("Number: " + number); // 输出数字 3

值声明后初始值为 0。输出第一次值之后,它的值被重新分配为 3。你甚至可以在重分配变量时引用它自身的值:

JavaScript
num aNumber = 4;
print("Number: " + number); // 输出数字 4
aNumber = aNumber - 1; // 将 aNumber 的值设置为它本身减去 1。
print("Number: " + number); // 输出数字 3

条件语句

if

if 条件语句会在条件为 true 时执行它之中的代码。

JavaScript
if(condition) {
    print("条件为 true");
}

在如上示例中,print 函数只会在 condition 为 true 时执行。假设 conditionbool 类型的数据。判断器中不能传入其他类型的数据。

比较

搭配比较语句的 if 条件语句潜力无穷。TerraScript 支持六种比较运算符,见上表。

这些比较符都是二元运算符,即它必须比较两个参数(或表达式)。

例如,5 > 1 会返回 true

等于和不等于号可以用在任何类型的数据上。但其他的运算符只能用于比较两个 num 类型的数据。

将其与 if 条件语句结合,我们会得到如下代码:

JavaScript
if(5 > 1) {
    print("条件为 true");
}

这还不是很有用。这条件只会返回 true!如果我把它与 randomInt 结合使用呢?

JavaScript
if(randomInt(2) == 0) {
    print("这条消息有一半的概率显示!");
}

引入外部条件之后,脚本可以在不同的情况下有着不同的结果。如果我们想要某样东西有一半几率返回甲,而剩下几率返回乙该怎么做?我们可以这样实现:

JavaScript
num randomNumber = randomInt(2);
if(randomNumber == 0) {
    print("这条消息有一半的概率显示!");
}
if(randomNumber == 1) {
    print("这条消息有另一半的概率显示!");
}

这非常不优雅。有一种更简洁且可读的方式实现相同的功能,即 else 语句。else 需要跟在 if 之后,用以表示 if 中的代码没有被执行时,之后执行的内容。用 else 重写上述的代码以后,它看起来像这样:

JavaScript
if(randomInt(2) == 0) {
    print("这条消息有一半的概率显示!");
} else {
    print("这条消息有另一半的概率显示!");
}

这比之前的代码更清晰了。我们还可以进一步将其压缩,因为每块代码都只包含一条表达式,因此可以简化为:

JavaScript
if(randomInt(2) == 0) print("这条消息有一半的概率显示!");
else print("这条消息有另一半的概率显示!");

注意我们省略了花括号。只有条件或循环中仅存在一条表达式,才可以省略这些。

else if

好吧,如果我们还想要更多条件怎么办?我们可以通过 else if 条件语句添加更多条件。它们会按序判断,会在其中一条为 true 时停止。

JavaScript
num randomNumber = randomInt(3);
if(randomNumber == 0) print("这条消息有三分之一的概率显示!");
else if(randomNumber == 1) print("剩下三分之一的概率显示这条消息!");
else if(randomNumber == 2) print("最后三分之一的概率显示这条消息!");

通过 else if 条件语句,我们可以让脚本更加简洁可读。else if 也可以搭配 else 使用,就像这样:

JavaScript
num randomNumber = randomInt(3);
if(randomNumber == 0) print("这条消息有三分之一的概率显示!");
else if(randomNumber == 1) print("剩下三分之一的概率显示这条消息!");
else print("最后三分之一的概率显示这条消息!");

循环

可以基于某个条件,重复运行某段代码。

while 循环

最简单的循环就是 while 循环。它需要在声明时传入一个布尔值表达式,称作条件。循环中声明的代码会在条件为 true 时一直执行。例如:

JavaScript
while(true) { // 因为条件总是 true,代码块将会无限循环。你应当避免这样的情况。
    print("这会一直循环!");
}

在这个示例中的循环会一直执行,这肯定不是我们想要的。

JavaScript
num aNumber = 0;
while(number < 5) { // 这个循环将会持续执行到 aNumber 不小于 5(大于或等于 5).
    print("数字: " + aNumber);
    aNumber = aNumber + 1; // 每次循环时都将 aNumber 的值加一。
}

这个循环会重复执行五次。控制台会显示这些信息:

log
数字:0
数字:1
数字:2
数字:3
数字:4

for 循环

for 循环与 while 循环相似,但它需要三个参数。例如:

JavaScript
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 代码块,或者循环中。例如:

JavaScript
print("这条消息会输出!");
return; // 在这里终止代码
print("这条消息永远不会输出!");

如上的示例会在输出第一条消息之后以“传出”状态退出。第二条消息永远不会被输出。

失败

fail 关键词会以“错误”状态结束。它可以用在 base 代码块,或者循环中。例如:

JavaScript
print("这条消息会输出!");
fail; // 在这里终止代码
print("这条消息永远不会输出!");

上述示例会在输出第一条消息之后以“错误”状态退出。第二条消息永远不会被输出。

需要注意的是,returnfail 都是级联,意味着如果它们被用在循环中,会立即跳出所有父循环并终止脚本。

终止

break 关键词会立即停止当前循环。他会立即退出循环,回到上一级循环。它是一个循环控制关键词,因此只能用在循环里。示例:

JavaScript
num aNumber = 0;
while(true) { // 通常情况下循环会无限执行。
    if(aNumber > 5) break; // 如果 aNumber 大于 5,则立即退出循环。
    print("Number:" + aNumber);
    aNumber = aNumber + 1;
}

上述循环会执行到 aNumber 大于 5 的时候,然后退出并执行脚本的剩余代码。

继续

continue 关键词会立即停止当前循环的遍历,回到循环开头,然后进入下一次循环(如果满足条件)。示例:

JavaScript
num aNumber = 0;
while(aNumber <= 5) { // 通常情况下循环会无限执行。
    aNumber = aNumber + 1;
    print("数字:" + aNumber);
    if(aNumber > 2) continue; // 如果 aNumber 大于 2,则立即回到代码顶部。
    print("小于 2");
}

上述代码会执行到 aNumber 大于 5 为止,会在每次它的值小于 2 时输出“小于 2”。

贡献者

页面历史