最近华为的仓颉编程语言很有话题度啊,一门新的编程语言还是很受大家关注的。
鄙人算是自制编程语言的一个“民科”,自从在大学学了编译原理后,就一直孜孜不倦地设计编程语言直到现在,之前也有发过不少文章,评论区里跟网友对线,也逐渐发现自己编程语言的不足,不过最近我突发灵感,想到了一个绝妙的编程语言语法,设计了一下感觉挺完备,特来分享一下:
一个 Hello World:
hello: 'Hello World!' print(hello)
GS 是一门面向函数的编程语言。用逗号,
分割语句,在一行语句末尾可以不加,就像 JS 一样在编译时自动加上,如果语句写在同一行则一定需要使用逗号来分隔。
下面是具体的 GS 语法设计,与 TS 做对比:
// 单行注释 /* 多行注释 */ # 类型注释(类型标注也会被看作一种注释,在编译后完全移除)
变量/常量用冒号:
声明,声明时必须赋值(哪怕是 undefined 也要写清楚),标识符后有问号?
表示是一个变量,变量赋值用等号=
。
a: 1 // 可以看作 const a = 1; b?: 2 // 可以看作 let b = 2; c: #number 3 // 可以看作 const c: number = 3; b = 4 // 可以看作 b = 4;
函数由一个大括号包裹,大括号的含义是模版,不会立即执行,最后通过调用执行,从而有了函数的含义,函数参数在大括号内部由 @符号标记,返回值不加 return (当然也可以加,但仅起到语意作用)。函数调用用中括号[]
来传递所有参数,如果只有一个参数,用小括号也是可以的:
add : #number { @a #number, @b: #number 12, a + b } add(1) add[1, 2] // 类比 TS: function add(a: number, b?: number = 12): number { return a + b; } add(1) add(1, 2)
sub: <T, K> #T|K { @a #T, @b: 12 #K, a - b } // 类比 TS: function sub<T, K>(a: T, b?: K = 12): T|K { return a - b; }
<T>#T{@a #T, a+1} // 类比 TS: <T>(a: T):T => a + 1;
条件语句的语句体用大括号{}
包裹,虽然与类 C 语法表面一致,但大括号在 GS 中永远表示模版语句,被调用才会执行:
if exp { ... } else if exp { ... } else { ... }
原理与条件语句相同:
for i: 0, i < 10, i+=1 { ... } for (i:0, j: 9), (i<10, j>0), (i+=1, j-=1) { ... }
数组调用用小括号,如果用中括号,那么将返回一个具有指定元素的数组
arr: #number[] [1, 2, 3] // 可以看作 const arr: number[] = [1, 2, 3]; arr: #Array<number> [1, 2, 3] // 可以看作 const arr: Array<number> = [1, 2, 3]; a: arr(1) // 可以看作 const a = arr[1]; b: arr[1, 2] // 可以看作 const b = [arr[1], arr[2]]; [c, d] : a // 可以看作 const [c, d] = a;
对象也用中括号(实在没有更多括号了),但是与数组不同的是必须标注出属性名:
a: [b: 1, c: #number 2, d: [f: 1]] [.b, .c] : a // 类比 TS: const a = {b: 1, c: 2 as number, d: {f: 1}}; const {b, c} = a;
GS 是一门面向函数的编程语言,没有关于类的特定语法,类的实现是通过函数+对象实现的:
Person: { @name #string @age: #number 12 [ name: name age: age printMe: { print(this.name, this.age) } ] } // 类比 TS: class Person { name: string; age: number = 12; constructor(name: string, age: number) { this.name = name; this.age = age; } printMe() { print(this.name, this.age) } }
大致这么多,其他没写的语法基本跟 TS 一样,就我个人感官上来说,有点怪,因为类 C 语言已经先入为主了,非类 C 语言都感觉很别扭,但是如果没学过类 C 语言的话,但看 GS 我感觉还是不错的,因为做到了语法的渐进式,前面的语法是后面的基础,是和谐统一的,看多了还是觉得挺顺眼的。
不吝赐教。
1 leoleoasd 2024-07-03 06:00:51 +08:00 ![]() 那么妙在哪里呢 |
![]() | 2 passive 2024-07-03 06:09:22 +08:00 via Android 妙在重新发明了 Perl |
3 Pantheoon 2024-07-03 09:36:21 +08:00 妙啊 |
4 BadFox 2024-07-03 09:51:44 +08:00 有一种“自撰一良方,服之,卒”的幽默感。 |
![]() | 5 andyJado 2024-07-03 10:30:40 +08:00 ?现在你就用了, 错误处理的时候你用啥呢? |
![]() | 6 meeop 2024-07-03 10:48:36 +08:00 看起来只是换了一下关键词,并没有引入什么语法功能或者提升某种场景开发效率功能特性? |
![]() | 7 FishStars 2024-07-04 09:49:35 +08:00 |
![]() | 8 lisongeee 2024-07-04 10:13:09 +08:00 你上次在 https://v2ex.com/t/1013732 不是说 GreatScript 已经 die 了吗,重命名成 JS# 了,咋又改回去了 |
![]() | 9 FYFX 2024-07-04 21:49:09 +08:00 你这个大括号能单独使用吗,有块作用域吗 |
![]() | 10 magiclx 2024-07-04 22:38:16 +08:00 看到 for 的三个括号,想到了 tcl 语言 |
![]() | 11 heroisuseless OP |
![]() | 12 heroisuseless OP @FishStars 在于好玩 |
![]() | 13 heroisuseless OP @lisongeee 完全不同的新东西了 |
![]() | 14 heroisuseless OP @meeop 语法本身就是特点,语法是渐进式的,意味着设计新语法时会有更多的语法一致性以及更少的移进规约冲突 |