内置函数

Silk内置了一些函数供使用者直接调用:
print(a...)
print函数用来打印输出,可以传入任意多个变量,print会按照先后顺序逐一打印输出,每个输出之间会打印一个空格。
a=9;
print(1002*10"hello"12.32, a);
输出内容如下:
100 20 hello 12.320000 9

如果参数里有数组或者字典,print会输出数组或字典对象里的具体数据,也就是所有元素的值:
a=[1,2];
b={"a":"good"};
print(100,a,b);
输出内容如下:
100 [1 , 2 ] {"a" : "good" }


printf(format, a...)
printf函数用来格式化字符串并打印输出,可以传入任意多个变量,printf会把第二个开始的变量按照format格式化成字符串后打印输出。
a=9.8;
printf("%s,%d,%f""good"100, a);
输出内容如下:
good,100,9.8000001

printf支持以下格式符号:
  •      %c     格式化字符及其ASCII码
  •       %s     格式化字符串
  •       %d     格式化整数
  •       %o     格式化八进制数
  •       %x     格式化十六进制数
  •       %X     格式化十六进制数(大写)
  •       %f     格式化浮点数字,可指定小数点后的精度
同时可以使用反斜杠 \ 转义特殊字符,支持转义字符如下:
  •     \\    反斜杠符号
  •     \"    双引号
  •     \a    响铃
  •     \b    退格
  •     \n    换行
  •     \r    回车
  •     \v    纵向制表符
  •     \t    横向制表符

sprintf(format , a...)
sprintf函数用来格式化字符串并返回,可以传入任意多个变量,sprintf会把第二个开始的变量按照format格式化成字符串后返回。
a=9.8;
s=sprintf("%s,%d,%f""good"100, a);
print(s);
输出内容如下:
good,100,9.8000001

sprintf支持和printf相同的格式符号和转义字符。

_input()
_input函数从标准输入设备(键盘)读取一行字符串并返回,用来读取用户的键盘输入。
print("请输入号码并按回车键:");
s=_input();
print(s);

_getargv()
_getargv函数获取Silk程序执行时的参数列表,第一个参数就是被执行的silk源文件的路径。
 如果从命令行执行如下的silk程序,传入额外的参数100:
Silk.exe c:\test.si 100

test.si的源代码如下:
main()
{
    args=_getargv();
    print("path:",args[0]);
    print("param:",args[1]);
}

输出内容如下:
path: c:\test.si
param: 100

_int(a)
_int函数把字符串或浮点数转换成整数。
s="78";
n=_int(s)+100;
print(n, _int(12.32));
输出内容如下:
178 12

_float(a)
_float函数把字符串或整数转换成浮点数。
s="78";
n=_float(s)+100;
print(n, _float(12));
输出内容如下:
178.000000 12.000000

_str(a)
_str函数把整数或浮点数转换成字符串。
i=200;
s=_str(i)+"km";
print(s,_str(12.32)+"m");
输出内容如下:
200km 12.32m

_len(a)
_len函数获取字符串,数组或字典的大小(元素个数),相当于它们各自的size()函数。
arr=[0,1,2];
n=_len(arr);
print(n,_len("hello"),arr.size());
输出内容如下:
3 5 3

_type(a)
_type函数获取变量的类型,返回类型的描述字符串。
arr=[1,2];
dict={1:"abc"};
print(_type(10),_type(1.23),_type("ok"),_type(arr),_type(dict));
输出内容如下:
INT FLOAT STRING ARRAY DICT

_copy(a)
_copy函数复制对象并生成一个新的对象。
通常情况下,对象(数组,字典,类)之间的赋值采用引用传递。
所以对象变量之间赋值后,2个变量实际指向的是同一个对象,改变变量2的值,变量1的值也会随之改变:
arr1=[0,1,2];
arr2=arr1;
arr2[0]=100;
print(arr1[0],arr2[0]);
输出内容如下:
100 100

如果需要2个变量之间互相独立,可以通过_copy函数复制并生成一个新对象赋值给变量2:
arr1=[0,1,2];
arr2=_copy(arr1);
arr2[0]=100;
print(arr1[0],arr2[0]);
输出内容如下:
0 100

_createthread, _createlock, _lock, _unlock
_createthread, _createlock, _lock, _unlock这一系列函数用来创建线程和线程同步。
详情参考多线程

 _loadlib, _freelib, _calllib
_loadlib, _freelib, _calllib这一系列函数用来调用C/C++语言建立的Dll扩展功能。
详情参考Dll扩展

_fun(name,a...)
除了上面直接调用的内置函数,还有一些二级内置函数通过_fun函数调用,_fun的第一个参数为函数名,后面为函数相应的参数。
内置二级函数列表:
 
1. _fun("url_escape", url)
url_escape 函数可对字符串进行编码,通常在网络编程中对Url字符串进行编码:
s=_fun("url_escape","Hello world!");
print(s)
输出内容如下:
Hello%20world%21

2. _fun("url_unescape", url)
url_unescape 函数可对url_escape 编码的字符串进行解码:
s=_fun("url_unescape","Hello%20world%21");
print(s)
输出内容如下:
Hello world!

3. _fun("time_clock")
time_clock 函数返回自程序启动起,处理器时钟所使用的时间,单位通常是微秒,可以用来计算程序执行的时间差:
t1=_fun("time_clock");
a=0;
for(i=0;i<10000;i++)
{
    a++;
}
t2=_fun("time_clock");
print("cost:",t2-t1);

4. _fun("time_now")
time_now 函数获取当前的时间,返回一个如下的字典对象:
{
    “time”: 1605171073,    //从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数
    “time_str”: "Thu Nov 12 16:52:42 2020",    //当前时间字符串
    “year”: 2020,    //返回当前年份
    “mon”: 11,    //返回当前月份
    “day”: 12,    //返回当前日期
    “hour”: 16,    //返回当前小时
    “min”: 58,    //返回当前分钟
    “sec”: 20,    //返回当前秒数
}
通常我们取字典中的time_str获取当前时间字符串:
t1=_fun("time_now");
print(t1["time_str"]);

5. _fun("time_rand")
time_rand 函数根据时间种子获取一个随机数:
rand=_fun("time_rand");
print(rand);

6. _fun("time_sleep", ms)
time_sleep 函数会让程序延时(挂起)一段时间,参数的时间单位为毫秒:
print(_fun("time_now")["time_str"]);
_fun("time_sleep",2000); //延时2000毫秒,即2秒
print(_fun("time_now")["time_str"]);

7. _fun("system", cmd)
system 函数可以调用系统的一些命令,如dir(windows),  ls(linux), cls, PAUSE等:
_fun("system","PAUSE");
_fun("system","notepad.exe");

8. _fun("encrypt", str, password)
encrypt 函数可以对字符串或二进制内容通过取反操作进行简单的加密和解密,参数为需要加密的字符串(二进制数据),密码,
函数返回加密后的数据,解密操作和加密相同,用相同的密码和加密后的字符串再一次调用函数:
s=_fun("encrypt","Hi, are you ok?","pass123");//加密字符串
print(s); //打印加密后的字符串,乱码
s=_fun("encrypt",s,"pass123");//用相同的密码再解密
print(s); //打印解密后的字符串

9. _fun("os_platform")
os_platform 函数获取操作系统平台的信息,用以判断Silk是运行在Windows,Linux或Mac,运行的Silk是64位还是32位的程序:
s=_fun("os_platform");
print(s);

10. _fun("curdir")
curdir 函数获取当前被执行程序(main函数所在的程序)所在目录。
curdir = _fun("curdir");

11. _fun("run", source, outputFile, args)
run函数用来执行silk代码,source为silk源代码字符串,outputFile为把运行结果写入outputFile文件中,如果只是在屏幕显示,就传入空字符串。
 args为传入源代码的参数,必须为字典对象,用以和被执行代码进行交互。
source="main(){ args=_getargv()[0]; print(args[10]); args[10]=\"great\"; }";
outputFile="";
args={10:"good"};//传入参数,类型必须为字典
_fun("run",source,outputFile,args);
print(args[10]);
输出内容如下:
good
great

12.  文件操作函数
13.  网络操作函数
14.  数学计算函数
15.  CGI应用函数
16.  服务器脚本
17.  正则表达式