我想到了一个绝妙的自制编程语言语法

107 天前
 heroisuseless

最近华为的仓颉编程语言很有话题度啊,一门新的编程语言还是很受大家关注的。

鄙人算是自制编程语言的一个“民科”,自从在大学学了编译原理后,就一直孜孜不倦地设计编程语言直到现在,之前也有发过不少文章,评论区里跟网友对线,也逐渐发现自己编程语言的不足,不过最近我突发灵感,想到了一个绝妙的编程语言语法,设计了一下感觉挺完备,特来分享一下:

GS 编程语言( GreatScript )(全新设计,之前官网不再有效)

目标

基础语法

一个 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 我感觉还是不错的,因为做到了语法的渐进式,前面的语法是后面的基础,是和谐统一的,看多了还是觉得挺顺眼的。

不吝赐教。

2016 次点击
所在节点    分享创造
14 条回复
leoleoasd
107 天前
那么妙在哪里呢
passive
107 天前
妙在重新发明了 Perl
Pantheoon
107 天前
妙啊
BadFox
107 天前
有一种“自撰一良方,服之,卒”的幽默感。
andyJado
107 天前
?现在你就用了, 错误处理的时候你用啥呢?
meeop
107 天前
看起来只是换了一下关键词,并没有引入什么语法功能或者提升某种场景开发效率功能特性?
FishStars
106 天前
不是很懂,这个新语言的意义在于?
lisongeee
106 天前
你上次在 https://v2ex.com/t/1013732 不是说 GreatScript 已经 die 了吗,重命名成 JS# 了,咋又改回去了
FYFX
105 天前
你这个大括号能单独使用吗,有块作用域吗
magiclx
105 天前
看到 for 的三个括号,想到了 tcl 语言
heroisuseless
105 天前
@FYFX 一个大括号就相当于一个匿名函数了,例如:
```
func: {1+1}
```
可以看作 TS 的:
```
function func() {
return 1+1;
}
```
heroisuseless
105 天前
@FishStars 在于好玩
heroisuseless
105 天前
@lisongeee 完全不同的新东西了
heroisuseless
105 天前
@meeop 语法本身就是特点,语法是渐进式的,意味着设计新语法时会有更多的语法一致性以及更少的移进规约冲突

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1054383

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX