赋值(=)和新槽(<-)
exp := derefexp '=' exp
exp:= derefexp '<-' expSquirrel实现了两种赋值形式:常用的赋值(=)a=10;
以及“新槽”赋值形式。
a <- 10;
“新槽”赋值表达式允许向表中增加一个新槽,如果表中已经存在这个槽,他的功能就和常用的等号表达式功能一样。
操作符(Operators)
?: 操作符
exp := exp_cond '?' exp1 ':' exp2
根据表达式“exp_cond”的值计算最终的表达式结果。
算数操作符(Arithmetic)
exp:= 'exp' op 'exp'
Squirrel支持标准的算数操作符 +, -, *, / 和 %。除此外,它也支持紧凑式算数运算符以(+=,-=,*=,/=,%=)及自增,自减运算符(++ and --);
a+=2;
//相同于
a=a+2;
x++
//相同于
x=x+1
以上所有的运算通常情况下都和整形和浮点型一起使用;如果一个操作数是整型,一个是浮点型,其结果将是浮点型。而+运算符有个特殊功能,可以用于字符串。如果一个操作数是字符串,那么+运算符将会尝试把两外一个操作数转换成字符串,并且将他们链接在一起。对于实例(instances)和表,该操作符会调用其_tostring方法。
关系运算符(Relational)
exp:= 'exp' op 'exp'
Squirrel中的关系运算符有:== < <= > >= !=。
如果表达式为假,该运算符返回null,反之返回非null。在虚拟机内部用1作为真,但是这在将来可能会改变。
逻辑运算符(Logical)
exp := exp op exp
exp := '!' ex
Squirrel中的逻辑运算符有:&& || !如果表达式第一个单元是null,则运算符&&(逻辑与)返回null,否则返回它第二个参数值。而||运算符,如果第一个参数不是null的时候返回第一个参数。值,否则返回第二个参数。!运算符当被操作数为null的时候返回非null。反之回null。
in运算符
exp:= keyexp 'in' tableexp
检测表中是否存在这个槽,如果keyexp是表中一个有效得键值,那么该表达式返回非null。
local t=
{
foo="I'm foo",
[123]="I'm not foo"
}
if("foo" in t) dostuff("yep");
if(123 in t) dostuff();
instanceof 运算符
exp:= instanceexp 'instanceof' classexp
测试这个类的实例是否是另外一个特定类的实例。如果是返回非null。
typeof 运算符exp:= 'typeof' exp
以字符串的形式返回值的类型。
local a={},b="squirrel"
print(typeof a); //打印 "table"
print(typeof b); //打印"string"
逗号表达式
exp:= exp ',' exp
逗号表达式从左到右计算两个表达式的值,其结果是最右边表达式的计算结果,左边的被忽略。local j=0,k=0;
for(local i=0; i<10; i++ , j++)
{
k = i + j;
}
local a,k;
a = (k=1,k+2); //a 变成3
按位操作符
exp:= 'exp' op 'exp'
exp := '~' exp
Squireel支持c形式的位运算符&,|,^,~,<<,>>以及无符号的右移运算符>>>. 该无符号右移运算符除了把左操作符当做无符号整型处理外,
其和通常的右移运算符(>>)一样。因此它不会受符号的影响。这些操作符只对整型有效,如果使用其他类型的值,改运算符将会抛出异常。
表构造器
tslots := ( ‘id’ ‘=’ exp | ‘[‘ exp ‘]’ ‘=’ exp ) [‘,’]
exp := ‘{’ [tslots] ‘}’
创建一个新表:
local a={} //创建一个空表
表构造器也可以包含一个新槽,语法:
id = exp [',']
一个以id作为key,以exp作为值的新槽将被创建。
local a=
{
slot1="I'm the slot value"
}
另外一种语法:
'[' exp1 ']' = exp2 [',']
一个以exp1
作为key,以
exp2
作为值的新槽将被创建。
两种语法可以被混合使用:
local table=
{
a=10,
b="string",
[10]={},
function bau(a,b)
{
return a+b;
}
}
槽之间的逗号是可选的。
delegate委托
exp:= ‘delegate’ parentexp : exp
设置表的父元素。parentexp的值被设置为exp的结果的父元素。该表达式的结果是exp本身.
clone克隆
exp:= ‘clone’ exp
克隆完成对表,数组,类实例的深拷贝(非递归的拷贝所有的槽到新的对象中)。如果源表中含有委托,将会给新表委托相同的委托(不拷贝)看 Delegation). 当新的对象创建之后,元方法"_cloned“被调用(看Metamethods)。当类的实例被克隆的时候,新对象的构造器是不会被调用(其初始化操作依赖于_cloned)
数组构造器
exp := ‘[’ [explist] ‘]’
创建一个数组
a <- [] //创建一个空的数组
数组可以在构造的时候初始化值
a <- [1,"string!",[],{}] //创建一个含有四个元素的数组。
表
表是以键值对形式实现的关联容器(键值对叫做槽);值可以为任意形式,键可以是出”null“之外的任何类型。表是Squireel的核心,委托以及其他很多特性都是通过表的形式实现的。还有环境变量存储也是个表(被称作root表)
表可以通过表构造器创建(看Table constructor)
创建槽
通过操作符"<-"在已知的表中添加新槽;”<-“操作符除了在槽不存在的时候创建槽这个功能外,其他和普通赋值运算符没有区别。
local a={}
下面这行将会触发一个异常,因为在表”a“中不存在名为”newslot“的槽。
a.newslot = 1234
正确的做法是:
newslot <- 1234;
或者
a[1] <- "I'm the value of the new slot";
删除槽
exp:= delete derefexp
通过关键字”delete“删除一个槽,该表达式的计算结果是被删除槽的值。
a <- {
test1=1234
deleteme="now"
}
delete a.test1
print(delete a.deleteme); //this will print the string "now"