TeaScript-语法文档
一、常量
1. 数字
0, +1, -2, 0.0, 1.0, +0.2, -.3
在语法中并不支持其它格式的数字,其它数字使用如下方式创建:
大数字: Number("1,223,100") //在数字中允许逗号或空格
非数字:Number.NaN
无穷大: Number.Infinity
十六进制:Number(hex: "FFFFF")
八进制:Number(octal: "0777")
二进制:Number(bit: "01010000 00000001")
科学计数法:Number("2e+4")
2. 字符串
'', "", ``
所有字符串内都允许换行。区别: ''是没有转义的原始字符串,在字符串内部用''代替'。 "" 和 ``完全等效,内部支持使用\开头的转义字符(在不引起歧义时可不加\)。并支持使用$开头的变量。如:
a = "1";
b = "我的值是 $a"; // b的内容是:我的值是 1
c = "我的值是 $${a+2}"; // c的内容是:我的值是 $3
3. 固定值
true
, false
null
: 表示空值。它表示有值,但是值是空的。undefined
: 表示未定义。它表示参数或变量未定义,一般不直接使用。this
: 代表当前类。不可省略。base
: 代表父类。不可省略。that
: 代表当前函数的调用方的类。比如 obj1.fn() 直接调用了 obj2.gn() 那么,在 obj2.gn() 中 that 代表 obj1。不可省略。out
: 在函数内嵌函数时,对内部函数来说, out 表示外层函数的作用域。在不引起歧义的情况下可以省略。比如 fn = { gn = { out.b = 2 // 代表在外部作用域创建变量 b,而不是当前作用域。 }; }
4. 对象
(1, 2, 3)
: 数组(Array)。()
表示空数组。 [1, 2, 3]
: 列表(List)。[]
表示空列表。 [aa:1, bb:2]
: 字典(Dict)。 [:]
表示空字典。 {}
: 函数。具体在下面介绍。
解析时,多余的","会被忽略。如 [,,,,1,,,,,] 等效于 [1]
二、操作符
1. 算数操作符
+, -, *, /, %(取余), ++, --
鉴于语言的目标不是用于科学计算,因此其它如位运算等操作符都不在语法中直接提供,要计算复杂表达式,使用:
Math.eval(plain: "1! + 2^6 - sin 3") // 此处的表达式是数学意义上的理解。 Math.eval(expression: "4 & 2 >> 5 | 4 ** 2") // 此处的表达式是代码意义上的理解,相当于 JavaScript 的表达式。
2. 赋值操作符
=, +=, -=, *=, /=, %=
=>(a => c 即 c = a)
3. 比较操作符
==, !=, <=, >=, <, >
4. 逻辑操作符
||
: 逻辑或计算,返回布尔值。&&
!
: 逻辑非
5. 逻辑控制操作符
a ? b : c
a?
: 标记变量 a 肯能是没有定义的值。a | b
: 如果 a 没有定义,则返回 b 。a & b
: 如果 a 已定义,则计算后续表达式。fn() or null
: 执行fn(), 出现错误返回 null
, 相当于: try{return fn()}catch{return null}
6. 成员操作符
a.b
a.(true ? "a" : "b")
: 动态调用。a[b]
: 读取索引。a..b
: 链式点操作,如 a..b()..c()..d() 相当于 a.b();a.c();a.d();
7. 类型操作符
a is String
: 判断 a 是否是 Stringa as String
: 将 a 转为 String
8. 函数调用
fn()
: 函数调用。不引起歧义时,函数调用的最外层函数可以省略括号。fn(a:1)
: 函数调用,传递命名参数。fn(a:1, b=>z)
: 函数调用,其中 z 是输出参数。Object()
: 创建类的实例。^fn()
: 调用函数,但确保函数只执行一次。
三、基本语句
1. 调试输出语句
>> 1; // 相当于 Debugger.trace(1); 在系统调试流输出变量。
2. 语句结尾
所有语句都必须用分号结尾,但是编译器会在没有歧义的情况下帮追加分号。
3. 变量
无需定义即可直接使用。
a = 1;
b = y | 4; // 如果 y 定义过,则 b = y; 否则 b = 4;
b %= a + b;
3 => e
4. if 语句
if(3 > 4){ }
if(3 > 4){ } else {}
if(3 > 4){ } else if (5 > 3){} else {}
if 5 > 2 {} // 不引起歧义的时候,括号可以省略。
5. switch 语句
switch(value){ // 不引起歧义的时候,括号可以省略。
case 1:
a = 4; // 2 个 case 之间不会互相干扰。无需使用 break 。
case 2, 3: // 匹配 2 或 3
a = 1;
goto case 1; // 使用 goto 强制跳转。
case else: // 默认匹配。
a = 5;
}
6. for 语句
for(i = 0; i < 1; i++) { } // 不引起歧义的时候,括号可以省略。
for(i < 1){} // 只有 1 个分号时,同传统的 while。
for(i in arr){} // for in 遍历。
7. 作用域执行语句
let(conn = Connection("url")) {
conn.send("command");
}
// 这句话相当于:
try {
conn = Connection("url");
conn.send("command");
} finnaly {
if(conn.dispose){
conn.dispose();
}
}
8. 跳转语句
break;
continue;
goto;
return; // 函数的最后一句会自动插入 return
throw "OutOfMemory", "error message";
assert a > 5, "error";
yield a;
9. try 语句
try {}
try {} catch {}
try {} finnaly {}
try {} catch {} finnaly {}
10. 语句块和语句标记
label: a = 1;
{} // 语句块,独立的作用域。
11. 注释
注释可以使用 // /**/ 表示。
#开头表示文档注释和宏语句。
四、函数和对象
1. 函数
函数参数无需声明,在函数内部通过 @ 标记。
fn = {
>> @a
>> @b
};
fn(a: 1, b: 2);
fn(1, 2); // 如果没使用命名参数,则参数会根据出现的顺序一一匹配,比如这里 a 匹配 1, b 匹配 2。
fn = { // @ 是当前的参数数组,通过此对象可以获取当前的全部操作。
for(i = 0; i < @.length; i++){ // 遍历未命名的参数列表。
>> @[i];
}
for(paramValue, paramName in @){ // 遍历全部参数列表。
>> paramName, "=", paramValue;
}
}
// @ 是 Arguments 类的示例,更多用法参考此类。
2. 类
class Duck : Animal {
Duck{} // 构造函数
fun {} // 定义1个方法
fun(value){} // 函数重载
fun(value: String = 100){} // 默认值和 自动转换的类型。
fun(val?){} // 可选参数。
get pro{} // 定义1个属性
set pro{} // 定义1个属性
add click {} // 定义1个事件。
remove click {} // 定义1个事件。
val = 1 // 定义1个静态字段。
+{} // 操作符的重载
}
类成员函数支持重载
类的字段、只读属性和事情不在类的声明里写。而是通过成员函数直接赋值。
如果类的成员是私有的,请为名字加上前缀 _ 。
class Duck : Animal {
setProps {
this._name = "1"; // 设置一个私有字段。
this.@name2 = "1"; // 设置一个公开的字段。
this.readOnlyProp = "2"; // 设置一个只读属性。
this.click = {} // 设置一个事件。
}
}
extend Duck {
// 通过此方法扩展存在的类成员。
}
3. 其它类型
struct Type [}
interface Interface2 {}
enum Flags {}
namespace Math {} // 仅仅作为名字空间使用的对象。
4. 模块系统
require system;
require ./my;
require http://.com/my
ns = require ./my/code
四、宏
1. 文档注释
后跟一个空格,此行文本将作为文档注释。
# 表示一个数组
class Array{
# 函数1
fn {
@a # 参数a (如果没有歧义会自动添加同行的 @a 参数名)
@b #@b:String 参数b
}
}
2. 区块宏
#region 区块
#endregion 区块
3. 编译器宏
#progma strict // 严格模式
#progma warning(disable:45056) // 禁用警告
#progma encoding("utf-8") // 定义文档内的字符串默认编码
4. 属性宏
#metadata inline
class Array{
}
// Array.attributes = Array("inline")
TeaScript 关键字
关键字
or is as if else for switch case let break continue goto try catch finnaly throw class struct interface enum namespace extend require
保留字
保留字是在特定场景作为关键字的词语。
true false null undefined this that out get set add remove yield assert require await return in