我也写过一族编程语言。。。的 spec - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
dvaknheo
V2EX    程序员

我也写过一族编程语言。。。的 spec

  •  
      dvaknheo 2019-05-09 18:17:18 +08:00 3866 次点击
    这是一个创建于 2425 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是一族哦,不是一门。 开始是想把语言搞出来,后来发现这太难,于是 先写 spec。 放在 gitbook 上没人看,就扔着了。 示例一下:

    @qz @mode @lazy print string Input a string readint print @string output ~ fib last func fib do return 1 on arg 1 = 1 or arg 1 = 2 return selfcall with arg 1 - 1 indeed + selfcall with arg 1 + 2 indeed end fib 

    啊,过这么多年,我都忘记了。 记得起来的: 自顶而下的解析方式。不用 BNF。

    关键字都是用 @ 打头, 其他语言能编译成 用 @ 打头 的核心语言。 一条语句以 @关键字开始,带不定数目个 @ 打头的子关键字,子关键字又能带子关键字。

    你可以用 @@ 强制开新行。

    示例代码不用 @ 打头,是因为 @qz @mode @lazy, 懒惰方式的原因,目的是如果 @ 打头能解释通,那么就是 @ 打头的次。 只有这两个是非 @ 打头的: print fib @string Input a string 等价于 "Input a string" ~ 是字符串连接 , 顺便, 字符串是一直没想好的部分。

    ~ fib last last 这个关键词是等于上一句的执行结果。 fib 是个函数 return on 等价于 on xxx return;

    selfcall with arg 1 - 1 indeed + selfcall with arg 1 + 2 indeed selfcall 等价于 自身函数

    with X 等价于 X, indeed 结束 with

    fib(arg(1)-1) + fib(arg(1)+2) == 哈哈,后一个我写成 +2 了,这个 bug 一直没发现。

    后面有个长一点的:

    @qz @mode standard # 使用 standard 模式 @import stdlib # 引入标准库, readInt 在里面 # 定义一个函数 # 你可以注意到 func 这个开头词. # 所有修饰词都用 @ 打头 #@func 用于定义一个函数 一般条件下可以省略 # 后面的 @都是 @func 的修饰词 @func @as int # 这里 表示 fib 这个函数返回 int 类型 @name Fib # 这个函数名为 Fib @args # 参数列表,这个修饰词有自己的子句 @with @deafult @as int @comment ”@default 代替了 @arg XX ” #后面的 @as int 修饰 @default . @endargs @comment 兔子数列 @do # @do 里面是语句块. @return 1 @on ( (@arg 1 @equals 1) or (@arg 1 @equals 2)); # return on 是 qz 语言常用的返回判断. # @arg:1 调用的第一个参数 # 和常见的 equals 是 == 的宏不同. == 才是 @equals 的 @return @sellcall(arg:1-1)+@selfcall(arg:1+2); @end func @end 是可带参数的用于检查配对 @main #main 是单独关键词 @do #显示 @call print @args @string Input a string @endargs #输入 @call readInt @setto t #判断 @if t @lt 0 @then @do @call print @string Minus! @return -2 @end @else @do @end #分支判断 @switch t @do @on 1 @do @pass @end @on 2 @do @end @default @do @end @end # 循环 # 异常 @try @do @call exception @deal throwOn @args @with conditions @values t @gt 10 @with @stringstart Too Big! @stringend @with -1 @endargs @end @catch @do # @end; @call print @string output: @concat @call fib @with t @return 0 @end main 

    @qz 语言讨厌符号。

    @func @name foo @return @as @auto 返回类型 @comment #这里是注释子句 @args @arg x @as int @default 0 @byval # 默认值为 0 传值模式 @arg y @default 20 @as @any @comment ” just do it ” # 注释也是代码结构 @endargs @dynmicargs # 动态参数 @staticargs # 固定参数 @multiReturn #多个 返回值 @independ # 该函数不调用项目里其他函数 @nolib # 该函数甚至连库函数都没调用 @nostatic # 该函数内部没有静态变量 @noglobal # 没有用到上级变量. @haddeclare # 外部有声明, @forsupport # 表示支持性函数 @for # 所在 @inline @stdcall # 使用 stdcall 模式 @fasecall # 使用 fastcall 模式 # 其他扩展会继续有的 @do # 其他语句放这里 @end # end 是 do 的子句 @func foo2 @as @int @do # 代码开始 @end 
    20 条回复    2019-05-10 11:40:15 +08:00
    HongJay
        1
    HongJay  
       2019-05-09 18:49:01 +08:00
    其实这也没人看。
    Northxw
        2
    Northxw  
       2019-05-09 18:53:13 +08:00
    我来安慰下楼主
    jon
        3
    jon  
       2019-05-09 18:55:54 +08:00   1
    @_@
    imningfeng
        4
    imningfeng  
       2019-05-09 18:57:06 +08:00
    @@@
    miaomiao888
        5
    miaomiao888  
       2019-05-09 19:00:37 +08:00
    妈鸭,看的我满眼冒 @_@
    janxin
        6
    janxin  
       2019-05-09 19:02:37 +08:00
    想到了 PHP 的$
    JsonSnowNothing
        7
    JsonSnowNothing  
       2019-05-09 19:02:45 +08:00 via Android
    我晕了
    whp1473
        8
    whp1473  
       2019-05-09 19:15:37 +08:00
    好晕
    veike
        9
    veike  
       2019-05-09 19:41:22 +08:00
    @o@
    6IbA2bj5ip3tK49j
        10
    6IbA2bj5ip3tK49j  
       2019-05-09 19:46:38 +08:00 via iPhone
    建议替换成$
    每一行都从钱开始
    你钱多可以牛逼一点,单独一行。
    cpdyj0
        11
    cpdyj0  
       2019-05-09 19:48:37 +08:00
    感觉自己的两只眼也变成 @@了,,这要是变成¥¥或者$$多好啊
    nguoidiqua
        12
    nguoidiqua  
       2019-05-09 20:02:49 +08:00
    知道为什么我不太喜欢 PHP 吗
    hxtheone
        13
    hxtheone  
       2019-05-09 20:17:10 +08:00
    @janxin #6 同, 语言里满是这种需要 shift 才能打出的字符简直无力吐槽
    Mutoo
        14
    Mutoo  
       2019-05-09 20:45:07 +08:00
    @hxtheone PHP 躺枪 $
    justyy
        15
    justyy  
       2019-05-09 20:46:29 +08:00
    hahahahaha
    6666
    shintendo
        16
    shintendo  
       2019-05-09 21:41:06 +08:00   1
    那真是 PHP 里写 jQuery 全是钱啊
    largecat
        17
    largecat  
       2019-05-09 22:27:30 +08:00 via Android
    满城尽带黄金甲(@)

    支持,
    dvaknheo
        18
    dvaknheo  
    OP
       2019-05-09 23:41:26 +08:00
    PHP 是变量的带 $ ,我是关键字带 @ ,之前没想到加,后来有天发现关键字带符号,可以形成 0 关键字的效果。
    为什么用 @ 不用 $ ,是可能 php 已经把 $ 用做变量名了吧
    用 # 注释,是因为想用一个符号做注释。

    @ comment 不过,还有这样的注释
    不过 @ qz @ mode lazy 模式 就把 @ 统统省掉了嘛。
    swordfeng
        19
    swordfeng  
       2019-05-10 07:08:00 +08:00
    重新发明 AST
    berumotto
        20
    berumotto  
       2019-05-10 11:40:15 +08:00
    @_@ 很久没晕代码了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5334 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 08:46 PVG 16:46 LAX 00:46 JFK 03:46
    Do have faith in what you're doing.
    ubao msn 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