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

2019-05-09 18:17:18 +08:00
 dvaknheo

是一族哦,不是一门。 开始是想把语言搞出来,后来发现这太难,于是 先写 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

3397 次点击
所在节点    程序员
20 条回复
HongJay
2019-05-09 18:49:01 +08:00
其实这也没人看。
Northxw
2019-05-09 18:53:13 +08:00
我来安慰下楼主
jon
2019-05-09 18:55:54 +08:00
@_@
imningfeng
2019-05-09 18:57:06 +08:00
@@@
miaomiao888
2019-05-09 19:00:37 +08:00
妈鸭,看的我满眼冒 @_@
janxin
2019-05-09 19:02:37 +08:00
想到了 PHP 的$
JsonSnowNothing
2019-05-09 19:02:45 +08:00
我晕了
whp1473
2019-05-09 19:15:37 +08:00
好晕
veike
2019-05-09 19:41:22 +08:00
@o@
6IbA2bj5ip3tK49j
2019-05-09 19:46:38 +08:00
建议替换成$
每一行都从钱开始
你钱多可以牛逼一点,单独一行。
cpdyj0
2019-05-09 19:48:37 +08:00
感觉自己的两只眼也变成 @@了,,这要是变成¥¥或者$$多好啊
nguoidiqua
2019-05-09 20:02:49 +08:00
知道为什么我不太喜欢 PHP 吗
hxtheone
2019-05-09 20:17:10 +08:00
@janxin #6 同, 语言里满是这种需要 shift 才能打出的字符简直无力吐槽
Mutoo
2019-05-09 20:45:07 +08:00
@hxtheone PHP 躺枪 $
justyy
2019-05-09 20:46:29 +08:00
hahahahaha
6666
shintendo
2019-05-09 21:41:06 +08:00
那真是 PHP 里写 jQuery ——全是钱啊
largecat
2019-05-09 22:27:30 +08:00
满城尽带黄金甲(@)

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

@ comment 不过,还有这样的注释
不过 @ qz @ mode lazy 模式 就把 @ 统统省掉了嘛。
swordfeng
2019-05-10 07:08:00 +08:00
重新发明 AST
berumotto
2019-05-10 11:40:15 +08:00
@_@ 很久没晕代码了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/562619

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX