返回   cpper编程论坛 > Blog > Innocentius
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

为这篇文章评分

PScript 脚本(进一步的特征)

发表于 2006-04-18 12:10 PM 作者: Innocentius
PScript具有进一步的特征,包括作用域、引用和动态对象等。

作用域

PScript具有作用域的概念。作用域是由BEGIN……END括起来的范围,下面的语句定义了两个作用域:
代码:
Declare a;
A=1;
 Begin
  Declare a;
  A=2;
   Print(a);
End;
 Print(a);
这段程序显示:
2
1
这表明在BEGIN内的Declare语句声明了一个新的变量A,并且A=2是针对这个新变量进行赋值的,因此没有影响外部作用域中的变量A的值。
默认情况下,名字的查找是由内部作用域向外部作用域进行查找,如果没有找到,则在最内部的作用域创建一个新变量。但是也可以指定从外部作用域向内部作用域查找,方法是在名字前加上“.”。例如:
代码:
Declare a;
A=1
 Begin
  Declare a;
  A=2;
   Print(a);
  Print(.a);
End;
这段程序显示:
2
1
符号a是从内部作用域向外搜索得到的变量,而符号.a是从外部作用域向内搜索得到的变量。
对于一个复合对象来说,同样具有作用域。例如:
代码:
Declare a: Object
Begin
  Declare b;
   Declare func: Function
  Begin
      B = 2;
       Print(b);
      Print(.b);
  End;
End;
 B = 1;
 Call a.func();
程序显示的结果为:
2
1
此处,func访问变量b类似于C++语言中通过this来进行访问类的成员变量一样。
引用

在PScript中,赋值语句仅仅复制引用,因此下面程序:
代码:
Declare a;
Set a = 1;
Set b = a;
Set b = 2;
Print(a);
运行的结果为2,而不是1。因为在赋值语句以后,变量a和b实际上都是值1的引用,当设置b=2,等价于把a=2,因此a的值也被改变。
引用同时用于函数调用的参数传递,因此下列程序:
代码:
Declare func: Function(a)
Begin
  A=2;
End;
 S=1;
 Call func(s);
Print(s);
运行的结果就是2,而不是1。
为了获得真正的拷贝,可以使用Clone语句来复制对象。
代码:
Declare a;
Set a = 1;
Clone b = a;
Set b = 2;
Print(a);
这段程序的运行结果是1,因为b是a的一个拷贝,而不是引用,因此修改b对a就没有任何影响了。
动态对象

和传统语言不同,PScript的对象并不是通过Declare声明以后就不能修改的。相反,程序员可以在任何时刻改变对象的类型,包括其中的字段。例如;

代码:
Declare arr: array[8] of object;
Arr[1]=1;
Declare a;
A=arr;
Print(a[1]);
这里,首先声明了一个数组arr,并且将第一个元素设置为1。然后声明变量a,将arr赋值给a,这时a就从一个简单变量转变为一个数组,然后我们就可以通过数组的语法来访问它了。
然而,下面的语句将会出现一个错误:
Declare a;
Print(a[1]);
这将会导致错误R770:Array object expected。这表明PScript发现a实际上并不表示任何数组,所以报告这个错误。
不仅可以在数据类型之间进行转换,也可以在函数类型之间转换。例如:
代码:
Declare f: Function(a)
Begin
  Print("Hello, ", a);
End;
 Declare a;
 Set a=f;
 Call a("Andrew");
这段代码将通过对象a来调用函数f,如同直接调用函数f一样。
简单对象也可以转换为复合对象。例如:
代码:
Declare co: object
Begin
  Declare a;
  Declare b;
  Declare func: Function
  Begin
      Print(b);
  End;
End;
 Declare o;
 o.a = 1;
o.b = 2;
o.func = co.func;
 call o.func;
 co.b = 1;
call co.func;
运行的结果是;
2
1
当对一个对象赋值,而这个对象实际不存在的时候,PScript会自动创建一个合适的对象。最终结果就可以动态地改变一个对象中的成员。
评论 0 Email文章
评论总数 0

评论

发表评论 发表评论
作者为 Innocentius 的最新文章

所有时间均为格林尼治时间 +9。现在的时间是 11:42 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0