早在 2015,我就已经精通了 C++、C#、JS,也用过其它语言,比如 PHP、Python、Java 做过一些项目,就觉得这些语言设计得太过复杂、坑多、麻烦,所以就开始设计一门新语言,暂且叫 T 语言。我希望新语言是非常简单的,比如不需要脚手架就可以开工,不担心依赖安装问题,不会因为用了很多依赖导致项目很大很卡。
设计的过程很辛苦,需要考虑到不同的情况,需要和不同的人讨论。一开始我以 C 为原型,前前后后修改了 90 多版,到现在以 JS 为原型。很多一开始觉得没用的功能,在经过多次增删后最后又重新放了回去。只有自己设计过语言才能体会到每个语言设计者背后的纠结。
声明
// 声明变量 var x = 1 const y = 2 var [x, y]: [number, number] = [1, 2] // 声明函数 function sub(x, y) => x - y function log() { } // 声明类 class X { field = 1 // 字段 method() { // 方法 } } class Y: X { // 继承 X new() { // 构造方法 } length { // 属性 } set length(value) { // 设置属性 } } // 声明枚举 enum Align { left, center, right } // 声明别名类型 type i32 = Int32
语句
// 基本逻辑判断和循环 if (x) { } while (x) { } for (var i = 0; i < arr.length; i++) {} for (var item in obj) {} // switch switch (x) { case 0: log(0) // 不需要 break case 1: continue // 强制穿透到下个 case case else: // 默认情况 log(1) } // 异常语句 try { } catch (e) {} finally {} assert x > 0 // 确保 x > 0 否则抛异常
表达式
// 数字 1 0xffff_ffff // 字符串 'x' "x" `1 + 1 = {1 + 1}` // 数组和对象 [1, 2, 3] {x: 1} // 函数 x => x (x, y) => x - y // 运算 x + y x - y x * y x / y x mod y // 取余 x ^ y // 次方 x == y x != y x < y x > y x <= y x >= y x & y x | y !x x ? y : z // 短路逻辑运算 x ?? y // 同 x != null ? x : y x++ y-- x = y x += y x is number x as number x.y x[y] x(y) new X() x?.y x?[y] x?(y) await fn() try fn() // 如果 fn() 出错,返回 null
类型
// 基本类型 any void null object number boolean string // 引用 X.Y X[] typeof x // 常量 1 [any, any] {x: null} // 组合 X | Y X & Y !X X is Y ? X : void // 计算 keyof X X["key"] {[key: keyof X]: any}
其它
// 导入 import "x" // 区间 arr[0..^1] // 数组中第 0 到倒数第 1 个 // 接口 interface X {} // 扩展 extension String {} // switch 表达式 var x = switch (y) { case 1: 2, case 1: 3 }