我想到了一个绝妙的自制编程语言语法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
heroisuseless
V2EX    分享创造

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

  •  
  •   2024-07-02 23:46:27 +08:00 2630 次点击
    这是一个创建于 465 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    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  
       2024-07-03 06:00:51 +08:00   1
    那么妙在哪里呢
    passive
        2
    passive  
       2024-07-03 06:09:22 +08:00 via Android
    妙在重新发明了 Perl
    Pantheoon
        3
    Pantheoon  
       2024-07-03 09:36:21 +08:00
    妙啊
    BadFox
        4
    BadFox  
       2024-07-03 09:51:44 +08:00
    有一种“自撰一良方,服之,卒”的幽默感。
    andyJado
        5
    andyJado  
       2024-07-03 10:30:40 +08:00
    ?现在你就用了, 错误处理的时候你用啥呢?
    meeop
        6
    meeop  
       2024-07-03 10:48:36 +08:00
    看起来只是换了一下关键词,并没有引入什么语法功能或者提升某种场景开发效率功能特性?
    FishStars
        7
    FishStars  
       2024-07-04 09:49:35 +08:00
    不是很懂,这个新语言的意义在于?
    lisongeee
        8
    lisongeee  
       2024-07-04 10:13:09 +08:00
    你上次在 https://v2ex.com/t/1013732 不是说 GreatScript 已经 die 了吗,重命名成 JS# 了,咋又改回去了
    FYFX
        9
    FYFX  
       2024-07-04 21:49:09 +08:00
    你这个大括号能单独使用吗,有块作用域吗
    magiclx
        10
    magiclx  
       2024-07-04 22:38:16 +08:00
    看到 for 的三个括号,想到了 tcl 语言
    heroisuseless
        11
    heroisuseless  
    OP
       2024-07-04 23:54:25 +08:00
    @FYFX 一个大括号就相当于一个匿名函数了,例如:
    ```
    func: {1+1}
    ```
    可以看作 TS 的:
    ```
    function func() {
    return 1+1;
    }
    ```
    heroisuseless
        12
    heroisuseless  
    OP
       2024-07-04 23:54:43 +08:00
    @FishStars 在于好玩
    heroisuseless
        13
    heroisuseless  
    OP
       2024-07-04 23:55:00 +08:00
    @lisongeee 完全不同的新东西了
    heroisuseless
        14
    heroisuseless  
    OP
       2024-07-04 23:57:22 +08:00
    @meeop 语法本身就是特点,语法是渐进式的,意味着设计新语法时会有更多的语法一致性以及更少的移进规约冲突
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     909 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 20:04 PVG 04:04 LAX 13:04 JFK 16:04
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86