北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 6475|回复: 0

轻轻松松学PIKE之一(zz)

[复制链接]
发表于 2004-6-18 18:23:57 | 显示全部楼层 |阅读模式
http://www.niniy.com/article/index.php?modules=show&id=20

作者:super 更新日期:2004-01-16 类别:MUD文档->技术资料 总浏览/今日:9/1
轻轻松松学PIKE之一
----神奇的PIKE
PIKE是一种基于解释的脚本语言,语法和C极其类似,并且有着十分强大的面向对象
编程机制。下面我们来看段hello world的代码:

int main()
{
    write("hello world!n");
    return 0;
}

这样就是一段简单的PIKE代码了,从表面上来看,跟C简直没有一点区别,那么我们
怎么来执行它呢?假如这个程序的文件名为:my_first_program.pike
那么我们就在命令符下执行:pike my_first_program.pike那么我们就可以看到这段
代码的执行结果了。

其实如果大家接触过LPC的话,会发现PIKE实际上更象LPC一点,无论是语法还是编程
思想,都跟LPC同出一辙。但在功能上比LPC语言显得更加强大一点。

跟LPC做比较,PIKE语言有以下几个改进:
一,新增multiset和program两种新的数据类型。

multiset跟mapping十分相似,都属于hash表数据结构,但是不同的是multiset只有
key,而没有values,举个例子吧。
mapping里面每一个key所对应的地址都有一个values.格式如下:
mapping a = ([
"aaa" : 1,
"bbb" : 2,
"ccc" : "hello",
..
]);
如此,key和values存在一种一一对应的关系。
而在multiset里面则不是这样,我们这样来声明一个multiset:
multiset a;
随后可以赋值:a = (<1,2,"hello",3>);
至于multiset的特殊用处,将在以后的章节中做详细介绍,这里仅仅只是对multiset
做个简单的介绍。

然后我们来看看program类型,了解LPC的人都知道,在LPC里面存在一种.b代码,也就
是大家常说的二进制(binary)代码,LPC里面的这种代码是以文件的形式保存在硬盘上
的,而在PIKE里面,则有专门的program类型来储存该种代码。任何一个文件,在生成
object前,都必须先生成program,相同的文件生成出来的program是相同的,而相同
的program生成出来的object则是不同的,举个例子:
program p = compile_file("aaa.pike");
//上面的代码可以简写成program p = (program)"aaa.pike";
program p1 = compile_file("aaa.pike");
那么这个时候p == p1是返回true的。
随后,我们:
object a = p();
object b = p();
这个时候a == b是返回false的,也就是说,同一个文件生成的program在内存中永远只
有一个副本,而同一个program可以复制出很多不同的object.
该类型的详细应用将在以后的章节中做详细介绍。

二,支持多线程。
PIKE里面加入了multi threads模块的支持。
其中可以很方便的对线程进行各种各样的操作。
下面来看一个简单的例子:
void run_me(string);
int main()
{
    thread_create(run_me,"thread 1");
    thread_create(run_me,"thread 2");
    run_me("main");
    return 0;
}
void run_me(string a)
{
    for (int i=0;i<5;i++)
          write("I come from " + a + ".n");
}
那么就可以看到多线程的威力了。
值得注意的是,在PIKE里面thread_create()返回的是一个object型的值,同时也可以在
所以我们要中断一个线程,就只需要destruct()掉thread_create()返回出来的object值
就行了,操作十分方便。
有一点值得注意的是,多线程只能在支持POSIX或者UNIX的操作系统上运行。

三,运算符重载。
运算符号重载是面向对象编程里面十分重要也是十分有用的一点。
在PIKE里面,提供了十分强大的运算符重载功能,可以重载任意运算符。
下面来看个例子:
比如,我们要让a-b的值变成a+b,则可以这么做:
mixed `-(mixed b)
{
    if (!intp(b) || !floatp(b)) return 0;
    return ::`+b;
}
然后在这以后,只要碰到a-b之类的运算都会转换为a+b了。
另外PIKE还支持LPC中的@运算符,即把@后面的array变量里面的每个元素作为参数传递
给@前面的函数,具体使用方法在这里就不做详细介绍了,看下面一个例子即可:
string *a = ({ "123","321"});
write(@a);
那么则会显示:123321
有一点值得注意的是在PIKE里面任何一个运算符都被看成是一个函数,因此我们可以用
调用函数的方式来使用运算符,即:
a + b我们可以写成`+(a,b)。
关于运算符重载的深入应用,将在以后的章节做详细介绍。

四,支持插入模块。
PIKE的各种各样的功能实际上都是模块的作用,比如说多线程,实际上是thread模块的
作用,PIKE目前的功能模块十分的多,目前有:
Image,Protocols,System,Process,Regexp,Gmp,Gdbm,Getopt,Gz,Yp,ADT,Yb,MIME,Mysql,
Crypto,Simulate,Calendar,Locale,Parser,Math
等等,模块的使用方法是xxx.yyy这样子,xxx是模块名称,yyy是模块内建函数名称。
由于模块的支持,使得PIKE具有了强大的扩展性。
下面来看一个自己写模块的例子:
我们创建一个文件:hello.pmod

void hello_world()
{
    write("hello world!n");
    return 0;
}
并把它放在add_module_path()里面,就可以这样使用:
int main()
{
    .hello.hello_world();
    return 0;
}
或者可以这样写:
import .hello;
int main()
{
    hello_world();
    return 0;
}
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-3-29 08:57 PM , Processed in 0.012297 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表