Crate value_expr

Source
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 断言第一个参数,剩余参数、返回值无意义。

Structs§

ContextHelper
DemoContext

Enums§

AssignOp
BinOp
UnOp
Value

Traits§

IContext
IContextHelper
IValue