V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dvaknheo
V2EX  ›  程序员

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

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

    是一族哦,不是一门。 开始是想把语言搞出来,后来发现这太难,于是 先写 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   ·   实用小工具   ·   2842 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:46 · PVG 21:46 · LAX 05:46 · JFK 08:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.