Expand description
Value Expr
§DSL
Value:
i32
| Unary
| Binary
| Assign
| Paren
| FuncLike
| Ident
Unary:
- Value
| ! Value
Binary:
Value + Value
| Value - Value
| Value * Value
| Value / Value
| Value % Value
| Value ^ Value
| Value & Value
| Value | Value
| Value << Value
| Value >> Value
| Value == Value
| Value != Value
| Value > Value
| Value < Value
| Value >= Value
| Value <= Value
| Value && Value
| Value || Value
Assign:
Ident = Value
| Ident += Value
| Ident -= Value
| Ident *= Value
| Ident /= Value
| Ident %= Value
| Ident ^= Value
| Ident &= Value
| Ident |= Value
| Ident <<= Value
| Ident >>= Value
Paren:
( Values )
FuncLike:
Ident ( Values )
Values:
<nothing>
| ValuesNext
ValuesNext:
Value
| Value , ValuesNext
Ident:
<the rust lang ident>
§Binary
运算优先级从低到高如下,同一优先级时按照顺序左结合运算。
在混合使用时,大于0的值被认为是true,否则为false,true对应的数值为1,false为0。
逻辑或 ||
逻辑与 &&
数值比较 == != > < >= <=
按位或 |
按位异或 ^
按位与 &
移位 << >>
数值运算 +-
数值运算 */%
§FuncLike
类函数,与普通函数不同的是,它允许延迟计算。命名上,建议所有含延迟的函数均以_开头,普通函数以英文字母开头。
§_if 条件判断
计算第一个表达式为判断条件,为真时执行第二个表达式,否则执行第三个表达式,返回前依次执行剩余表达式。
_if() =: 0
_if(a()) =: if a() { 0 } else { 0 }
_if(a(),b()) =: if a() { b() } else { 0 }
_if(a(),b(),c()) =: if a() { b() } else{ c() }
_if(a(),b(),c(),d()...) =: { let t = if a() { b() } else { c() }; d()...; t }
§_fn 函数定义
取第一个参数为函数标识,第二个参数为函数体,剩余参数为函数参数,函数体中可以使用函数参数作为变量读写,返回值为函数ID。
若函数标识为Ident,则定义为函数名,否则为匿名函数计算其值作为函数ID。
_fn(add,a+b,a,b) =: fn add(a,b) { a+b }
_if(1,a+b,a,b) =: |a,b|a+b
§_call 函数调用
取第一个参数值为函数标识,剩余参数为函数参数,返回值为函数执行结果。
若函数标识为Ident,则取对应函数ID,否则计算其值作为函数ID。
_fn(add,a+b,a,b)
_call(add,1,2) =: add(1,2)
_if(1,a+b,a,b)
_call(2-1,1,2) =: 1+2
§_call_inline 匿名函数
取第一个参数值为函数体,剩余参数为函数参数,返回值为函数执行结果。
_call_inline(arg0+arg1,1,2)
§_scope 变量域
创建一个变量域,类似fork机制,变量域内可写入当前域,可读取当前域或父级域或父父级域等等,默认0,依次计算每个参数,取最后一个作为返回值,默认0。
_call、_call_inline 函数调用同样会创建一个变量域。其余场景不会创建变量域。
_scope(a=100,_assert(a==100)),
_scope(a=100,_scope(_assert(a==100))),
_scope(a=100,a=200,_assert(a==200)),
_scope(a=100,_scope(a=200),_assert(a==100))
_fn(f1,_assert(a==0)),
_scope(a=100,_fn(f1,_assert(a==100))),
_scope(a=100,_fn(f1,(a=200,_assert(a==200))),_assert(a==100))
§_while 循环
取第一个参数值为循环条件,循环依次计算每个参数,取最后一次循环最后一个值作为返回值。
(
i=10,
_while(i<20,
_if(i%2==0,_log(i_is,i)),
i+=1,
i
)
)
§_log、_debug、_assert 调试工具
_log 日志打印,保留第一个参数,打印剩余参数的值,返回最后一个值的结果。
_debug 打印内部数据状态,参数、返回值无意义。
_assert 断言第一个参数,剩余参数、返回值无意义。