void main()
{
mixed a = [1];
a += [2];
a += ["hello"];
a += [[1,2]];
a -= [2];
a -= ["hello"];
a -= [[1,2]];
debug_message("%O",a);
}
这段lpc代码会输出什么呢?
我们先从字节码分析吧。
引用
……
002c: short_string "hello"
002e: aggregate 1
0031: local_lvalue LV0
0033: -=
0034: pop
0035: push number 1, number 2
0039: aggregate 2
003c: aggregate 1
003f: local_lvalue LV0
0041: -=
……
-=字节码对应的数组处理代码如下
void f_sub_eq(){
……
case T_ARRAY:
{
sp->u.arr = argp->u.arr = subtract_array(argp->u.arr, sp->u.arr);
sp->u.arr->ref++;
break;
}
……
}
subtract_array代码流程如下
- 先以被减数组大小分配新数组,把要减去的数组堆排序(alist_sort)
- 再循环被减数组,每个元素用二分方式查找,比较(alist_cmp),没找到则放入新数组
- 调整新数组大小(realloc),返回结果
在1、2步中,被减数组与减去的数组里的字符串都会判断是不是在共享的字符串池中,如果不是会放入共享字符串池中 。所以字符串的比较是相当于指针比较。但数组也是直接比较地址,由于数组地址不一样,所以没有删除。
int alist_cmp(svalue_t *p1, svalue_t *p2){
register int d;
if ( (d = p1->u.number - p2->u.number) )
{
return d;
}
if ( (d = p1->type - p2->type) )
{
return d;
}
return 0;
}
所以输出结果:
[1, [1, 2]]
作者:翁志艺
分享到:
相关推荐
FluffOS仅需很少的代码更改即可支持所有基于LPC的泥浆。 如果您目前仍在使用MudOS,则绝对是时候进行升级了!版本当前版本是v2019。 使用基于cmake的构建系统,它支持在Linux / OSX / Windows(WSL和msys2两者)上...
MudOS的源码,可以使用vs2008进行编译和调试。
MudOS(LPC)的教程,是学习mud开发的必备教程
Mudos中用到的LPC语言教程,不错的教程入门文档
MUDOS 源码 服务器端,无mudlib。。。。。。
mudos v21c2的帮助手册中文翻译版. 感谢作者翻译
单机版所需的mudos源码,不过还是很有意思的。
mudos.泥巴服务端,mud文字游戏服务端
Mudos的efun手册,chm中文版,使用起来比较方便。
Fading Summer的mudlib是基于LP的mud(MudOS驱动程序),被设计为在全球范围内推出最好的LP编码器的基础。 欢迎有LPC知识并希望帮助编写核心Mudlib的任何人加入该项目。
泥土2015 年 3 月 4 日: add redis support in packages/rd.c2012 年 7 月 14 日: add mongodb support in packages/mg.c , mongoc-v0.8.12012 年 7 月 7 日: change lpc int to long suport 64bit2011年初: add...
CISTOMS是用LPC编写的Mudlib,用于经过修改的MudOS驱动程序。 它具有用于有限访问容器,通用物品,房间和开放式蘑菇状出口的原型。 尽管计划了更多,但简单的随机心跳驱动了战斗系统。
很久以前的MUD游戏源码和mudos,给需要和感兴趣的朋友
2015最新的mudos fluffos 支持64位 支持数据库
泥巴服务器,比较新的支持mysql和epoll