Skip to content

Latest commit

 

History

History
123 lines (85 loc) · 3.43 KB

28-bang-basic-line.md

File metadata and controls

123 lines (85 loc) · 3.43 KB

bang-基本行

Other (其它行)

这是bang语言可以编写大部分逻辑语句的基础, 它由多个值1组成, 由分号结尾.

比如123 abc "xy";会编译为很像的123 abc "xy", 可以看出仅仅只是去掉了一个分号

Label (标签)

这是由一个冒号和一个变量组成的跳转标签, 标记了朝这个标签跳转时会跳到下一行前面

比如:label. 和逻辑语言不同的是, 这个冒号是加在前面的

Goto (跳转)

这是基本的跳转到某个标签的语句, 当条件满足会跳转到标签, 否则不进行跳转正常继续执行.

大部分的控制语句其实都是这个的语法糖, 可以通过A编译选项观察, 比如do-while, 就会生成一个头部的匿名2变量, 并在尾部跳转过去

do { print 2; } while x < y; 会生成如下代码

{
    :___0
    {
        `'print'` 2;
    }
    goto :___0 x < y;
}

建议使用了bang后就不要使用原本的jump了, 而是使用goto替代, 因为bang并不认识jump

Expand-Block (展开块)

这写出来表示为一对花括号, 可以在一行的语法中编写多行.

例如{print 1; print 2;}

这还会携带一个展开环境(Expand Env), 不过这时候不用管它

Inline-Block

内联块, 相比展开块多了inline的前缀, 它真的就只是简单的编译多条语句, 不会像展开块那样携带展开环境. 例如inline {print 1; print 2;}

Print (打印)

这是一个很简单的语句, 接受任意个值, 展开成多个print

比如print "x: "x", y: "y"\n";会展开为

print "x: "
print x
print ", y: "
print y
print "\n"

Op (运算)

这就像逻辑里面的op, 但是有一些方便编写的扩展, 比如以下四种写法等价:

op add x a b;
op x a add b;
op + x a b;
op x a + b;

Op-Expression (Op表达式)

这是方便编写较为复杂的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

No-Op (无操作)

这必须编译为一行, 且不应进行任何的操作. 默认情况下是编译为noop.

noop在导入逻辑时会显示为Invalid, 导出时则是noop, 学到后面时可以使用内建函数调整No-Op编译到的语句


上一章 目录 下一章

Footnotes

  1. 在之后会讲解, 在这只需要知道变量(Variable)也是值(Value)的一种就行

  2. 自动生成的不重复名称