fscript 脚本引擎

1. 介绍

fscript 是一个极简的脚本引擎,借鉴了函数语言中一些思路,主要用于低端嵌入式系统,让用户轻松扩展现有系统,而不需要重新编译和下载固件。

  • 特色:
    • 小内存。最低开销小于 400 字节。
    • 小巧。核心代码 600 行,扩展函数 600 行。
    • 灵活。支持多条语句、函数嵌套调用和变量定义。
    • 强大。超过 50 个内置函数,支持用 C 语言扩展函数。
      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name
      5108        134       1051          0          0      27871   fscript.o
  • 限制:
    • 不支持循环。
    • 不支持函数定义。

2. 示例

print("hello fscript")

在 PC 上测试运行:

./bin/runFScript 'print("hello fscript")'

3. 语法

数据类型

  • 浮点数类型 (double)。
  • 整数类型 (int32)。支持十进制、二进制和十六进制。
  • 字符串类型 (string)。UTF-8 字符串,用英文双引号扩起来。
  • 布尔类型 (bool)。标准取值为:true 和 false,非 0 的数值视为 true。

函数调用

print(0xff)
print(100)
print(0b1010)
print("hello fscript")
print("hello", 123)

定义变量

set(a, 123)

获取变量

a

函数嵌套调用

print(join(",", 1, 2, 3))
print(join(",", +(1, 2), -(5, 2), *(2, 3), /(9, 3)))

条件执行

if(false, print("a"), print("b"))
if(true, print("a"), print("b"))

4. 函数

4.1 基本函数

print


原型
print(str)

示例

print("hello fscript")
print("hello", "fscript")
print(1)
print(true)

noop


原型
noop()

if


原型
if(p, s1, s2)

示例

set(a, 1)
if(<(a, 0), print(" a < 0"), print("a >= 0"))

set


原型
set(var, value)

示例

set(a, 1)

unset


原型
unset(var)

示例

unset(a)

int


原型
int(var)

示例

int("123")

float


原型
float(var)

示例

float("123")

str


原型
str(var)

示例

str(int(123))

iformat


原型
iformat(format, value)

示例

iformat("hello:%d", 123)

fformat


原型
fformat(format, value)

示例

fformat("hello:%lf", 123)

exec


原型
exec(cmd, arg)

示例

exec("clear", "all")

4.2 字符串函数

join


原型
join(seperator, s1, s2, s3...)

示例

join(",", 1, 2, 3, "abc")

len


原型
len(str)

示例

len("abc")

toupper


原型
toupper(str)

示例

tuppper("abc")

tolower


原型
tolower(str)

示例

tolower("ABC")

trim


原型
trim(str)

示例

trm("  abc  ")

substr


原型
substr(str, from, len)

示例

substr("abcd", 1, 2)

replace


原型
replace(str, old, new)

示例

replace("ab cd", "ab", "hello")

contains


原型
contains(str, substr)

示例

contains("ab cd", "ab")

4.3 运算函数

sum


原型
sum(n1,n2...)
+(n1,n2...)

示例

print(sum(1, 2, 3))

运行:

./bin/runFScript 'print(sum(1, 2, 3))'

输出:

6.000000

sub


原型
sub(n1,n2)
或
-(n1,n2)

示例

print(sub(2, 1))
print(-(2, 1))

运行:

./bin/runFScript 'print(sub(2, 1))'

输出:

1.000000

mul


原型
mul(n1,n2)
或
*(n1,n2)

示例

print(mul(2, 1))
print(*(2, 1))

运行:

./bin/runFScript 'print(mul(2, 1))'

输出:

2.000000

div


原型
div(n1,n2)
或
/(n1,n2)

示例

print(div(2, 1))
print(/(2, 1))

运行:

./bin/runFScript 'print(div(2, 1))'

输出:

2.000000

%


原型
%(n1,n2)

示例

print(%(23, 7))

运行:

./bin/runFScript 'print(%(23, 7))'

输出:

2.000000

and


原型
and(n1,n2)
&&(n1,n2)

示例

print(&&(true, false))
print(&&(true, true))

运行:

./bin/runFScript 'print(and(true, true))'

输出:

true

or


原型
or(n1,n2)
||(n1,n2)

示例

print(and(true, false))
print(||(true, true))

运行:

./bin/runFScript 'print(or(true, false))'

输出:

true

not


原型
not(n1)
!(n1)

示例

print(not(true))
print(!(false))

运行:

./bin/runFScript 'print(not(false))'

输出:

true

&


原型
&(n1,n2)

示例

print(&(1, 1))

运行:

./bin/runFScript 'print(&(1, 2))'

输出:

0

|


原型
|(1,2)

示例

print(|(1, 2))

运行:

./bin/runFScript 'print(|(1, 2))'

输出:

3

~


原型
~(n1)

示例

print(~(1))

运行:

./bin/runFScript 'print(iformat("0x%x", ~(1)))'

输出:

0xfffffffe

比较函数

<


原型
<(1,2)
less(1,2)

示例

print(<(1, 2))
print(<("a", "b"))

运行:

./bin/runFScript 'print(<(1, 2))'

输出:

true

<=


原型
<=(1,2)
le(1,2)

示例

print(<=(1, 2))
print(<=("a", "b"))

运行:

./bin/runFScript 'print(<=(1, 2))'

输出:

true

>


原型
>(1,2)
great(1,2)

示例

print(>(1, 2))
print(>("a", "b"))

运行:

./bin/runFScript 'print(>(1, 2))'

输出:

true

>=


原型
>=(1,2)
ge(1,2)

示例

print(>=(1, 2))
print(>=("a", "b"))

运行:

./bin/runFScript 'print(>=(1, 2))'

输出:

false

==


原型
==(1,2)
eq(1,2)

示例

print(==(1, 2))
print(==("a", "b"))

运行:

./bin/runFScript 'print(==(1, 2))'

输出:

false

4.4 数学函数

random


原型
random()
random(min, max)

示例

print(random())
print(random(0, 100))

sin


原型
sin(a)

示例

sin(0)

cos


原型
cos(a)

示例

cos(0)

tan


原型
tan(a)

示例

tan(1)

asin


原型
asin(a)

示例

asin(1)

acos


原型
acos(a)

示例

acos(1)

atan


原型
atan(a)

示例

atan(1)

abs


原型
abs(a)

示例

abs(1)

min


原型
min(a, b)

max


原型
max(a, b)

示例

max(1, 2)

示例

min(1, 2)

clamp


原型
clamp(a, min, max)

示例

clamp(2, 1, 3)

4.5 时间函数

time_now


原型
time_now()

示例

time_now()

time_now_ms


原型
time_now_ms()

示例

time_now_ms()

time_now_us


原型
time_now_us()

示例

time_now_us()

5. 自定义函数

定义函数

static ret_t func_foo(object_t* obj, fscript_args_t* args, value_t* v) {
  value_set_int(v, 123);

  return RET_OK;
}

注册和使用

  value_t v;
  object_t* obj = object_default_create();
  object_set_prop_pointer(obj, "function.foo", (void*)func_foo);

  fscript_eval(obj, "foo()", &v);
  value_reset(&v);

  OBJECT_UNREF(obj);
05-30 00:28