2011-12-03 | #1 |
高级会员
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望:
50
现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
LPC语言学习
LPC就是我们用来写MUD的语言啦,它的语法和C 基本一样。 它独特之处在于有简单的 OOP特性(简单但很有用:PP), 还有一个C里面没有的HASH表的类型:MAPPING LPC和C还有一个不同是 其主函数是CREATE()而不是MAIN()。create()别写错哦:PP LPC里面主要的 (也是写MUD所足够的)数据类型有int,string,mapping,object, mixed。 下面主要讲一下这些类型了。 因为整数类型对于写MUD已经足够,所以不用FLOAT了。同样的, 因为我们的 汉字是双字节的,所以CHAR类型其实也没用,只需要STRING 类型就可以了。 STRING的定义,这里要提一下:string常量的赋值, 假如是常量的话可以只用 “连接”的办法代替string,例如: string str = "我" "们" ; 那么结果是str == "我们" 同样的str = "我" "们";也是一样, 空格与换行在LPC编译时是被忽略的,所以我们 写MUD的时侯不仿多些TAB和换行, 这样程序容易看些。 当然,除了直接连接之外还可以用 + 连接。 在有变量的时侯就要用了。 例如: string str0 = "我们"; string str1 = "和"+str0+"大家"; 结果是str1 == "和我们大家" mixed是一个比较特别的类型。 mixed 类型的变量可以赋任何其他类型的值。 这在未知变量类型的时侯非常有用。 不过一般情况下很少会用到mixed。 LPC里面没有“指针”的概念。 在变量名前面加 * 的定义表示数组。如int *a 表示a 是整数数组。 一般来说我们定义数组时是未知其大小的。所以定义时不用象 C 那样给定大小。 数组和MAPPING有些类似,所以将在下面和MAPPING一起讲它们 的操作。 LPC里面没有“指针”的概念。在变量名前面加 * 的定义表示数组。 如int *a 表示a 是整数数组。一般来说我们定义数组时是未知其大小的。 所以定义时不用象 C 那样给定大小。数组和MAPPING有些类似, 所以将在下面和MAPPING一起讲它们 的操作。 object, 是OOP概念了, 在LPC里面好象有CREATE()的都可以做object 类型变量 了。 object 我们称为“对象”,在MUD里就是一件物品, 一个房间或任何一个“具 体”的东西,都是OBJECT。“对象”, 在OOP中是一些数据与基于这些数据的函数的 集合(好象文诌诌的? :PP) 嗯,object 中的数据一般不能直接操作(至少在LPC 里面不能的 :PP), 所以对object的操作只有赋值(对object类型的赋直 )和执行 object的函数 ( private函数不能被外部调用 )。 函数调用格式: eg. object ob; ob->test(1,2); 基本格式: object类型变量名->函数名(函数参数列); 其中若该object 中未定义该函数名的函数则返回 0 值 (呵呵,不会有出错信息的哦, 所以千万别写错名字了)。 写了这么多终于写到LPC 最有特色的两个类型了,mapping和数组。 mapping和数组在“外观”上有些类似,所以在一起写了。前面提到过: mapping是 散列表,具体如何这里不详述了,只希望大家一定要记住mapping的格式!! ( 实际 上这格式只在给变量赋初值时用到 )mapping 格式如下: eg. mapping a = ([ "ab" : 1 , "cd": 2 , ]) 标准格式: mapping 变量名 = ([ key1 : value1 , key2 : value2 , .......... .......... ]); 其中key可以是除了int以外的任何值!! (好象char也不行吧 :P ), 包括任何数组 甚至mapping也可以做key ,而value则可以是任意所有值。 mapping的应用在于: 可以用key来index得到相应的value值。 如上面eg的,我们有:a["cd"] == 2,.... 因为要用key来index的关系, 在mapping中key值不能相等,若相等则覆盖掉原来该 key对应的value。 写的有些乱了,SORRY :P 那么一个mapping怎么改变它的值呢? 有两个方法(下面设mapping map )。 1. map[key] = value; 2. map += ([key : value ]); 请大家留意第二种赋值方法, 它跟我们将要提到的数组的方法一样的 。 在mapping中“删除”一个key (其相应value当然也没了)方法是: map_delete(map,key); lpc里面的系统函数(efun)的命名一般按参数顺序来取名 ( map_delete的参数就是 map在前,被delete的key在后的 ), 希望大家注意。 另外mapping的efun还有values,keys,undefinedp 大家可以直接在MUD里 help efunname 来看帮助, 也可以参阅 /doc/lpc/types/mapping 这一文件。 数组: 即ARRAY,前面说过,LPC中的数组只要在类型后面加 * 就可以了 一般来说数组不用预先定大小 但若有需要可以用allocate(size)来固定大小。 如:a = allocate(10); 在固定了SIZE之后好处是可以任意用下标定位来对数组元素操作。 我的习惯是不用固定SIZE的数组,因为那样更自由些。数组的操作在LPC里是相当强的。 最常见的是 +, - 操作,也是最useful的。 +就是通常的“连接”操作, -是集合的“差”操作,如果没有这两个概念请看下面例子: a == ({ 1,2,2,3, }) 则a + ({2,3,4}) == ({ 1,2,2,3,2,3,4}) a - ({ 2,1}) == ({3}) 请注意 - 的时候会把所有相同的元素都消掉的。 结合上面例子可以知道ARRAY常量的表示方法了,就是 ({元素,元素,....}) 当然这只是一维数组(事实上我们用一维数组就足够了,我想) 在对数组的元素改变的时候,一般可以用直接赋值,如a[3] = 2; 在对数组的元素改变的时候,一般可以用直接赋值,如a[3] = 2; 如何删除一个元素?假如你确定该元素的值唯一的话可以用 - ({元素值 }) 但要是有同值元素的话就会把它也删掉了,那不是我们所要的。 一般常用的方法是把该元素赋一个“不可能值”,或者说“无用值”, 然后再用 - 把该元素删除掉,比如说 我们确定数组内所有元素都为正, 则我们可把那个元素赋值为0然后把数组 -= ({0}) 关于array的一个很有用的函数是member_array 用法是 member_array (元素值,数组,起始下标(可选) ); 函数返回数组中从下标开始第一个元素值为所搜索值的元素下标。 若无则返回-1; 嗯,LPC的数组是跟C一样的,下标从0开始到size-1 ,请注意。 member_array的参数中起始下标一般可缺省。 eg: a = ({1,2,2,3}) 则 member_array(2,a) == 1 member_array(2,a,2) == 2 member_array(4,a) == -1 ARRAY和MAPPING可以说是LPC里面最有用和最直接用的结构了。 再加上两个功能强大的函数:filter_array 和filter_mapping。 我们有了filter就可以实现对ARRAY,MAPPING里各元素的过滤操作。 这样一来我们就可以实现数据库的操作了, 这样我们的LPC程序所拥有的功能 是非常强大了。 最后说一下多维数组的定义方法。 多维数组一般各维SIZE固定的,有两种方法定义: eg1: 定义多维数组变量 a = allocate(10); a[0] = allocate(10); a[1] = allocate(10); ...etc... 也就定义了a [10][10] eg2: 用mixed 类型 = 多维数组常量 mixed a; a = ({ ({ 1, 2, 3 }), ({ 1, 2, 3 }) }); OK,关于LPC语言的学习就介绍到这里,相信你一定有所进步了,再继续看下面的教程吧! |
|