跳转到内容
View in the app

A better way to browse. Learn more.

彼岸论坛

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

[分享创造] 我想到了一个绝妙的自制编程语言语法

发表于

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

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

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

目标

  • 渐进式的语法
  • 能编译成 JavaScript (以后能转译成汇编)
  • 自己喜欢做这件事(最重要的一点)

基础语法

  • ():小括号表示立即执行,用于表达式或者作用域
  • {}:大括号表示模版执行,用于函数定义,if/for/while 等语句体
  • []:中括号表示数组或对象(对象待定,因为键盘上没有其他括号了,所以跟数组融合了。。。。)
  • <>:尖括号表示泛型,跟 TypeScript 的差不多一样

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

不吝赐教。

Featured Replies

No posts to show

创建帐户或登录来提出意见

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.