博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

T 语言语法设计方案总结

Posted on 2020-02-02 22:47  xuld  阅读(967)  评论(0编辑  收藏  举报

早在 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
}