这是bang语言可以编写大部分逻辑语句的基础, 它由多个值1组成, 由分号结尾.
比如123 abc "xy";
会编译为很像的123 abc "xy"
, 可以看出仅仅只是去掉了一个分号
这是由一个冒号和一个变量组成的跳转标签, 标记了朝这个标签跳转时会跳到下一行前面
比如:label
.
和逻辑语言不同的是, 这个冒号是加在前面的
这是基本的跳转到某个标签的语句, 当条件满足会跳转到标签, 否则不进行跳转正常继续执行.
大部分的控制语句其实都是这个的语法糖, 可以通过A
编译选项观察,
比如do-while
, 就会生成一个头部的匿名2变量, 并在尾部跳转过去
如do { print 2; } while x < y;
会生成如下代码
{
:___0
{
`'print'` 2;
}
goto :___0 x < y;
}
建议使用了bang后就不要使用原本的jump了, 而是使用goto替代, 因为bang并不认识jump
这写出来表示为一对花括号, 可以在一行的语法中编写多行.
例如{print 1; print 2;}
这还会携带一个展开环境(Expand Env), 不过这时候不用管它
内联块, 相比展开块多了inline
的前缀, 它真的就只是简单的编译多条语句,
不会像展开块那样携带展开环境. 例如inline {print 1; print 2;}
这是一个很简单的语句, 接受任意个值, 展开成多个print
比如print "x: "x", y: "y"\n";
会展开为
print "x: "
print x
print ", y: "
print y
print "\n"
这就像逻辑里面的op, 但是有一些方便编写的扩展, 比如以下四种写法等价:
op add x a b;
op x a add b;
op + x a b;
op x a + b;
这是方便编写较为复杂的op使用的, 同时会很好的直接使用最外层op
实现是采用了D-Expression, 这个之后会学到
x = a+log(b);
会编译为如下代码
op log __0 b 0
op add x a __0
也支持多对赋值, 比如a, b = 1, 2;
是a=1; b=2;
,
还有一些自运算, 比如a += 1;
是a = a + 1;
.
也支持三元表达式, 比如x = if a ? 1 : 2; end;
会编译为
jump 3 notEqual a false
set x 2
jump 4 always 0 0
set x 1
end
这必须编译为一行, 且不应进行任何的操作. 默认情况下是编译为noop
.
noop
在导入逻辑时会显示为Invalid
, 导出时则是noop
,
学到后面时可以使用内建函数调整No-Op编译到的语句