是一族哦,不是一门。 开始是想把语言搞出来,后来发现这太难,于是 先写 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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.