V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
heroisuseless
V2EX  ›  分享创造

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

  •  
  •   heroisuseless · 168 天前 · 2104 次点击
    这是一个创建于 168 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    不吝赐教。

    14 条回复    2024-07-04 23:57:22 +08:00
    leoleoasd
        1
    leoleoasd  
       168 天前   ❤️ 1
    那么妙在哪里呢
    passive
        2
    passive  
       168 天前 via Android
    妙在重新发明了 Perl
    Pantheoon
        3
    Pantheoon  
       168 天前
    妙啊
    BadFox
        4
    BadFox  
       168 天前
    有一种“自撰一良方,服之,卒”的幽默感。
    andyJado
        5
    andyJado  
       168 天前
    ?现在你就用了, 错误处理的时候你用啥呢?
    meeop
        6
    meeop  
       168 天前
    看起来只是换了一下关键词,并没有引入什么语法功能或者提升某种场景开发效率功能特性?
    FishStars
        7
    FishStars  
       167 天前
    不是很懂,这个新语言的意义在于?
    lisongeee
        8
    lisongeee  
       167 天前
    你上次在 https://v2ex.com/t/1013732 不是说 GreatScript 已经 die 了吗,重命名成 JS# 了,咋又改回去了
    FYFX
        9
    FYFX  
       166 天前
    你这个大括号能单独使用吗,有块作用域吗
    magiclx
        10
    magiclx  
       166 天前
    看到 for 的三个括号,想到了 tcl 语言
    heroisuseless
        11
    heroisuseless  
    OP
       166 天前
    @FYFX 一个大括号就相当于一个匿名函数了,例如:
    ```
    func: {1+1}
    ```
    可以看作 TS 的:
    ```
    function func() {
    return 1+1;
    }
    ```
    heroisuseless
        12
    heroisuseless  
    OP
       166 天前
    @FishStars 在于好玩
    heroisuseless
        13
    heroisuseless  
    OP
       166 天前
    @lisongeee 完全不同的新东西了
    heroisuseless
        14
    heroisuseless  
    OP
       166 天前
    @meeop 语法本身就是特点,语法是渐进式的,意味着设计新语法时会有更多的语法一致性以及更少的移进规约冲突
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5472 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 93ms · UTC 05:54 · PVG 13:54 · LAX 21:54 · JFK 00:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.