是一族哦,不是一门。 开始是想把语言搞出来,后来发现这太难,于是 先写 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
1
HongJay 2019-05-09 18:49:01 +08:00
其实这也没人看。
|
2
Northxw 2019-05-09 18:53:13 +08:00
我来安慰下楼主
|
4
imningfeng 2019-05-09 18:57:06 +08:00
@@@
|
5
miaomiao888 2019-05-09 19:00:37 +08:00
妈鸭,看的我满眼冒 @_@
|
6
janxin 2019-05-09 19:02:37 +08:00
想到了 PHP 的$
|
7
JsonSnowNothing 2019-05-09 19:02:45 +08:00 via Android
我晕了
|
8
whp1473 2019-05-09 19:15:37 +08:00
好晕
|
10
6IbA2bj5ip3tK49j 2019-05-09 19:46:38 +08:00 via iPhone
建议替换成$
每一行都从钱开始 你钱多可以牛逼一点,单独一行。 |
11
cpdyj0 2019-05-09 19:48:37 +08:00
感觉自己的两只眼也变成 @@了,,这要是变成¥¥或者$$多好啊
|
12
nguoidiqua 2019-05-09 20:02:49 +08:00
知道为什么我不太喜欢 PHP 吗
|
15
justyy 2019-05-09 20:46:29 +08:00
hahahahaha
6666 |
16
shintendo 2019-05-09 21:41:06 +08:00 1
那真是 PHP 里写 jQuery ——全是钱啊
|
17
largecat 2019-05-09 22:27:30 +08:00 via Android
满城尽带黄金甲(@)
支持, |
18
dvaknheo OP PHP 是变量的带 $ ,我是关键字带 @ ,之前没想到加,后来有天发现关键字带符号,可以形成 0 关键字的效果。
为什么用 @ 不用 $ ,是可能 php 已经把 $ 用做变量名了吧 用 # 注释,是因为想用一个符号做注释。 @ comment 不过,还有这样的注释 不过 @ qz @ mode lazy 模式 就把 @ 统统省掉了嘛。 |
19
swordfeng 2019-05-10 07:08:00 +08:00
重新发明 AST
|