跳转到内容
彼岸论坛
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

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


小天管理

已推荐帖子

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

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

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

不吝赐教。

意见的链接
分享到其他网站

加入讨论

您现在可以发表并稍后注册. 如果您是会员,请现在登录来参与讨论.

游客
回复主题...

×   粘贴为富文本.   粘贴为纯文本来代替

  只允许使用75个表情符号.

×   您的链接已自动嵌入.   显示为链接来代替

×   您之前的内容已恢复.   清除编辑器

×   您无法直接粘贴图片.要从网址上传或插入图片.

  • 游客注册

    游客注册

  • 会员

  • 最新的状态更新

    没有最新的状态更新
  • 最近查看

    • 没有会员查看此页面.
×
×
  • 创建新的...