语言手册

[ E 语言的命名约定 ]
[
程序的启动方式 ]
[
E 语言的语言要素 ]
  [ 数据类型 ]
    [ 系统基本数据类型 ]
      [ 字节型 ] [ 短整数型 ] [ 整数型 ] [
长整数型 ]
      [
小数型 ] [ 双精度小数型 ] [ 逻辑型 ] [ 日期时间型 ]
      [
文本型 ] [ 字节集 ] [ 子程序指针 ]
    [ 库定义数据类型 ]
    [
自定义数据类型 ]
    [ 引用库定义或自定义数据类型对象的成员 ]
  [ 命令及操作符 ]
  [
子程序 ]
    [ 子程序参数 ]
  [ Dll 命令 ]
  [ 程序集 ]
  [ 容器 ]
    [ 全局容器 ] [ 程序集容器
] [ 局部容器 ]
    [ 容器的初始化 ] [
容器的赋值 ] [ 容器的定义 ] [ 参考容器 ]
  [ 常数 ]
    [ 数值型常数 ] [ 逻辑型常数 ] [ 日期时间型常数
] [ 文本常数 ]
    [ 子程序指针常数
] [ 常数集 ]
  [ 常量 ]
  [ 资源 ]
  [
窗口、窗口单元及窗口程序集 ]
    [ 窗口的载入 ]
    [ 窗口单元的固定事件 ]
    [ 窗口单元的固定属性 ]

E 语言的命名约定

  在 E 应用程序的编写过程中,用户涉及到定义各类名称,如:子程序名、容器名、数据类型名等等,这些名称的命名规则为:名称的首字母必须为全半角字母或汉字,其它字符必须为全半角字母、全半角数字或者汉字。虽然名称中允许半角字符“_”存在,但它被保留为系统专用,因此不要使用。与其它的编程语言相比, E 语言的命名规则有以下特点:

程序的启动方式

  每个 E 应用程序都可以在两种启动方式中选择一种,即:

  系统安装后默认为第一种启动方式,用户可以使用“程序 -> 系统配置 - 通常夹 - 程序启动方式”菜单功能进行更改。

  在第一种启动方式下,程序运行时系统将自动查找并载入名称为“_启动窗口”的窗口。在第二种启动方式下系统将自动执行名称为“_启动子程序”的子程序。

E 语言的语言要素

  所有的 E 应用程序,都由下列语言要素或其中的一部分组成:

  一、 数据类型

  数据类型分为系统基本数据类型库定义数据类型用户自定义数据类型三类。

  1. 字节型。可容纳 0 到 255 之间的数值。

  2. 短整数型。可容纳 -32,768 到 32,767 之间的数值,尺寸为 2 个字节。

  3. 整数型。可容纳 -2,147,483,648 到 2,147,483,647 之间的数值,尺寸为 4 个字节。

  4. 长整数型。可容纳 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之间的数值,尺寸为 8 个字节。

  5. 小数型。可容纳 3.4E +/- 38 (7位小数) 之间的数值,尺寸为 4 个字节。

  6. 双精度小数型。可容纳 1.7E +/- 308 (15位小数) 之间的数值,尺寸为 8 个字节。

  7. 逻辑型。值只可能为“真”或“假”,尺寸为 2 个字节。“真”和“假”为系统预定义常量,其对应的英文常量名称为“true”和“false”。

  8. 日期时间型。用作记录日期及时间,尺寸为 8 个字节。

  9. 文本型。用作记录一段文本,文本由以字节 0 结束的一系列字符组成。

  10. 字节集。用作记录一段字节型数据。字节集与字节数组之间可以互相转换,在程序中允许使用字节数组的地方也可以使用字节集,或者相反。字节数组的使用方法,譬如用中括号对(“[]”)加索引数值引用字节成员,使用数组型数值数据进行赋值等等,都可以被字节集所使用。两者之间唯一的不同是字节集可以变长,因此可把字节集看作可变长的字节数组。

  11. 子程序指针。用作指向一个子程序,尺寸为 4 个字节。具有此数据类型的容器可以用来间接调用子程序。参见例程 sample.e 中的相应部分。

  在以上的基本数据类型中,字节型、短整数型、整数型、长整数型、小数型、双精度小数型被统称为“数值型”,它们之间可以任意转换。不过编程需要注意转换可能带来的精度丢失。譬如:将整数 257 转换为字节后的结果为 1 ,这是因为值 257 超出了字节型数据的最大上限 255 ,从而产生了溢出。

  另外,通用型数据类型仅在系统内部使用,它能够匹配所有的系统基本数据类型、库定义数据类型、自定义数据类型。

  库定义数据类型由运行支持库提供,用户在程序中可以直接使用,就如同是系统基本数据类型一样。

  用户可以随时在程序中自行定义新的数据类型。自定义数据类型时需要设置数据类型的名称及其成员。数据类型成员各属性的设置方法等同于容器设置时相应属性的设置方法。

  数据类型成员等同于对象的属性,必须通过具有该数据类型的对象来引用。引用方法参见编程基础知识中的《引用对象的属性及方法》节。

  二、命令及操作符

  命令由运行支持库提供给用户在程序中使用,它们被分为很多类。有些命令的最后一个参数可以被扩展,譬如“相加”,它的“加数”参数可以被无限制地扩展,用作支持连续相加。这些命令在录入到程序中后在编辑窗口内其首部会显示出一个右双箭头作为标志。命令中的某些参数也有可能可以被省略,即调用时可以不提供参数数据。具体情况请参阅《支持库手册》。

  下面列出所有具有操作符的命令及其操作符运算优先级,值越小运算优先级越高。优先级高的命令在计算表达式时将被先执行,同优先级的命令按顺序执行:

命令名称

优先级

中文操作符号

英文操作符号

1 -
相乘 2 × *
相除 2 ÷ /
整除 3 \
求余数 4 % 或 Mod
相加 5 +
相减 5 -
不等于 6 <> 或 !=
等于 6 = 或 ==
小于 6 <
大于 6 >
小于等于 6 <=
大于等于 6 >=
近似等于 6 ?=
并且 7 And 或 &&
或者 8 Or 或 ||
赋值 9 =


  三、子程序

  将程序分割成较小的逻辑单元就可以简化程序设计任务,这些部件被称为子程序。 子程序可用于压缩重复任务或共享任务,例如,压缩频繁的计算处理等等。

用子程序编程有两大好处:

  每次调用子程序时,子程序中的所有语句都将被从第一条开始顺序执行,当执行到子程序尾部或者遇到“返回”命令时即返回到调用此子程序语句的下一条语句处。

  子程序可以接收参数数据和返回值。参数数据由调用子程序的语句传递过来,子程序的返回值被返回到调用子程序的语句处。

  子程序如需要返回值,必须先在子程序定义表的“返回值类型”栏中定义欲返回值的数据类型,然后在子程序中使用“返回”命令返回相应格式的数据。

  子程序如需要接收参数数据,必须先在子程序定义表中参数表部分定义与欲接收数据数目相同的参数。调用子程序时所传递过来的数据将被顺序地填入对应的参数中。如果所传递过来的数据与对应位置处的参数数据类型不一致,在可以互相转换时,系统将自动进行转换,否则会产生运行时错误。参数仅能在子程序内部使用。

定义子程序参数时需要定义以下几项主要属性:

四、Dll 命令

  在 E 应用程序中可以直接调用系统外部动态连接库(即 Dll 库)中的命令。在调用前,必须首先进行定义,定义Dll 命令涉及到以下主要属性:

  1. 类型。Dll 命令参数所定义的数据类型应该与实际的 Dll 库命令一致。可以使用除了文本数组字节集数组外的任何数据类型,包括库自定义用户自定义数据类型

  2. 传址。某些实际 Dll 库命令的参数需要接收数据地址,设置本属性为真可以确保将参数数据的地址传递过去。如果参数数据的类型为数组文本字节集用户定义数据类型库定义数据类型,则无论此属性是否为真,都将传递数据地址。如果本属性为真且调用 Dll 命令时所传递过来数据的类型与相应位置处所定义参数的数据类型不一致但可以相互转换,则系统先分配一块临时内存空间,然后进行转换并将转换后的数据存放到该空间,最后将此内存空间的地址传递到实际的 Dll 库命令。参见例程 sample.e 中的相应部分。

  3. 数组。意义同上

五、程序集

  程序集顾名思义即子程序的集合,用作将应用程序中的子程序分组归类。在程序编辑过程中,每个程序集将在单独的编辑窗口内进行编辑。

六、容器

  容器即其它编程语言中的“变量”。

  在 E 应用程序执行期间,可以使用赋值语句在容器内临时存储数据。容器有名字(用来引用容器所包含内容的词)和数据类型(确定容器能够存储数据的种类)。

  容器有使用范围,在全局容器表内定义的容器被称为“全局容器”,可以被整个应用程序中的所有子程序使用;在程序集容器表内定义的容器被称为“程序集容器”, 仅能够被此程序集中的所有子程序使用;在子程序容器表内定义的容器被称为“局部容器”,仅能够被此子程序所使用。

  所有全局容器、程序集容器、局部静态容器在程序被启动运行前、所有非静态局部容器在其所处子程序被开始执行前,都将被自动分配空间并初始化。其中,数值型容器被初始化为零,逻辑型容器被初始化为假,日期时间型容器被初始化为 1899 年 12 月 30 日 0 时 0 分 0 秒,文本型容器被初始化为空文本(“”),字节集型容器被初始化为空字节集,子程序指针型容器被初始化为空子程序指针。
  特例:系统在对库定义数据类型的对象容器进行初始化时,将首先查询该数据类型的各成员在库中是否指定了初始值。如果指定了初始值,则使用该值进行初始化。譬如:“字体”为系统核心支持库中所提供的库定义数据类型,其“字体大小”成员的初始值在库中被指定为 9 点(1 点等于 1 / 72 英寸),“字体名称”成员的初始值被指定为“宋体”。

  非数组容器可以通过赋予一个常数、常量、资源、对象或者容器来赋值。所赋予过来数据的数据类型必须与被赋予容器的数据类型一致或者可以互相转换。可以将一个对象赋予给容器后再使用该容器间接引用此对象。譬如:假设存在一个数据类型为“标签”,名为“容器1”的容器,使用“容器1 = 窗口1.标签1”语句可以将“窗口1”上的“标签1”窗口单元对象参考到“容器1”上,以后在程序中就可以直接使用“容器1.标题”来引用“窗口1”上“标签1”单元的标题属性。

  数组容器可以通过赋予一个常数集或者另外一个数组容器来赋值。如果所赋予的数组数据的成员数目小于此数组容器的成员数目,那么多余成员部分将被自动重新初始化。如果大于此数组容器的成员数目,将会产生运行时错误。

  1. 容器名。 定义该容器在程序中的使用名称;

  2. 类型。定义该容器所能储存数据的数据类型;

  3. 静态。本属性仅在定义局部容器时需要被设置。如果局部容器在定义时此属性被设置为假,那么运行应用程序时,此容器在其所在子程序开始被执行前自动分配存储空间并初始化,在所在子程序执行完毕后自动释放所分配的存储空间。也就是说,容器的存储空间仅在其所在子程序执行过程中存在;如果此属性被设置为真,那么此容器与全局、程序集容器一样,被分配给在程序运行期间永久存在的存储空间并仅在应用程序启动运行前被初始化一次。

  4. 数组。设置当前容器是否为数组容器及数组各维的上限值(即成员数目)。如为多维数组,定义时各上限值之间用逗号分隔。引用容器数组中某成员的方法为使用被中括号括住的从 1 开始的索引数值,如:“[1]”(单维数组),“[2][1]”(多维数组)。所有多维数组均可以使用单维数组格式引用其成员。譬如:数组定义为“2, 3”的多维数组,其成员“[2][2]”可以被单维数组格式“[5]”所引用。

  使用“参考”命令可以将一个容器的内容置为参考到其它容器的指针,以后对此容器进行的读写操作将被自动转移到其所参考到的容器。具体情况请参见系统核心支持库中有关“参考”命令的解释。

七、常数

  常数为可以直接在程序中使用的数据,具有以下几种类型:

1、[1982年4月23日12时30分25秒]
2、[1982/4/23/12/30/25]
3、[1982/4/23/12:30:25]
4、[1982-4-23-12-30-25]
5、[1982-4-23-12:30:25]

八、常量

  常量用作存储在整个应用程序执行过程中保持不变的数据,其类型可以为数值、文本、逻辑值和日期时间。E 语言核心支持库中已经提供了许多常量,但用户也可以在程序中自行定义。常量的引用表达方式为符号“#”再加上常量名称。如:“#pi”常量等同于数值“3.1415926535”、“#换行符”常量等同于文本 <回车> + <换行> 等等。

九、资源

  资源用作存储用户需要在程序中所使用的图片、声音等等字节数据,其数据类型为字节集型。引用表达方式等同于常量

十、窗口、窗口单元及窗口程序集

  窗口为应用程序的界面,窗口单元为窗口的组成成员。每个窗口拥有一个专用程序集,名为窗口程序集。此窗口上所有的事件处理子程序都必须放在此程序集中。窗口程序集中的子程序引用所属窗口上的窗口单元属性或方法时可以省略窗口对象。譬如:假设程序中存在名为“窗口1”的窗口,该窗口上绘制有一个名为“标签1”的标签窗口单元。在其它程序集中的子程序欲引用“窗口1”的“标题”属性需要使用“窗口1.标题”,引用“标签1” 的“标题”属性需要使用“窗口1.标签1.标题”。而在该窗口的窗口程序集中的子程序可以直接使用“标题”、“标签1.标题”来进行相同的引用。

  系统核心支持库中定义的“窗口”窗口单元数据类型的所有方法能够被其它所有非功能类窗口单元数据类型所共享,就好象这些方法是其本身所具有的一样。

  在一个程序集中可以就象引用窗口对象的属性或方法一样来引用另外一个窗口程序集中的程序集容器和子程序。譬如:假设存在名为“窗口1”的窗口,其窗口程序集中存在名为“容器1”的程序集容器,名为“子程序1”的子程序,在其它程序集中可以使用“窗口1.容器1”及“窗口1.子程序1”来引用此程序集容器和子程序。

  窗口单元的属性除了被标明为“只读”的外,其它属性在运行时皆既支持读也支持写。

  程序内所设计的所有窗口,运行时在使用前都必须先载入。除开“_启动窗口”由系统在启动程序时自动载入外,其它窗口都必须使用“载入窗口”命令载入。有关查阅“载入窗口”命令详细信息的方法,请参见《支持库手册》。在窗口被载入后,所有对此窗口及其所有单元的对象属性的修改,在窗口被关闭后都将自动被复原到设计状态。但是如果在窗口被载入前修改了窗口或其单元的固定属性,则此属性值将永久存在而不会被复原,就好象是在设计窗口时所设置的一样。

  所谓窗口单元固定事件,即由系统而非窗口单元本身提供支持的窗口单元事件。其列表如下:

1、鼠标左键被按下:当在窗口单元上按下鼠标左键时产生本事件。

2、鼠标左键被放开:当在窗口单元上放开被按下的鼠标左键时产生本事件。

3、被双击:当在窗口单元上双击鼠标左键时产生本事件。

4、鼠标右键被按下:当在窗口单元上按下鼠标右键时产生本事件。

5、鼠标右键被放开:当在窗口单元上放开被按下的鼠标右键时产生本事件。

6、鼠标位置被移动:当在窗口单元上移动鼠标时产生本事件。

事件(1 - 6)的事件参数为:

1、横向位置: 指示鼠标在当前所处窗口单元中的横向位置;

2、纵向位置: 指示鼠标在当前所处窗口单元中的纵向位置;

3、功能键状态:用于查看各功能键是否被同时按下。可以为以下常量值或其和: 1、#Ctrl键状态; 2、#Shift键状态; 4、#Alt键状态。要判断是否同时按下了某个功能键,在此参数值与想要得知功能键的状态常量值之间使用“位与”命令进行比较。如果所得的结果不为零,表示同时按下了此功能键。

7、按下某键:当用户按下某键时产生本事件。

8、放开某键:当用户放开所按下的键时产生本事件。

事件(7 - 8)的事件参数为:

1、键代码: 为键常量值,如:“#F1键”、“#回车键” 等等。具体所有的键常量见系统核心支持库库常量表;

2、功能键状态。其意义同上

  对于事件(1 - 8),对应的事件处理子程序皆可以返回一个逻辑值。如果返回假,则取消本事件,不再将此事件传递到所属窗口单元上去;如果不返回值或返回真,则将此事件继续传递到所属窗口单元上去。

9、获得焦点:当窗口单元获得输入焦点时产生本事件。

  所谓“输入焦点”,即当前用户按键操作所对应的目标对象。譬如:用户正在编辑框中输入文本,那么此编辑框就具有输入焦点,因为它将获得目前用户所进行的所有按键操作。所谓“获得”或者“失去”输入焦点,即当前用户按键操作所对应的目标对象发生转移。譬如:现在用户正在编辑框1中输入文本,突然使用鼠标或其它方法切换到了编辑框2上去继续输入。那么此时,编辑框1就“失去”了输入焦点,编辑框2就“得到”了输入焦点,因为在此以后用户所进行的所有按键操作都将被改为编辑框2所获得。

10、失去焦点:当窗口单元失去输入焦点时产生本事件。

11、字符输入:当用户按下和松开一个字符键时产生此事件。

  字符键包括任何可打印的键盘字符及回车(Enter)和退格(BackSpace)键。在对应的事件处理子程序中,将事件处理完毕后可返回一个字符代码,用于替换将继续传递到所属窗口单元上字符键事件中的字符代码;如果返回 0 ,则取消此事件,不再将此事件传递到所属窗口单元上去;如果事件处理完毕后没有返回值,则将本字符键事件继续原样传递到所属窗口单元上去。

本事件的事件参数为:

1、字符代码: 表明所按下的字符键所对应的字符代码,可以使用“字符”命令取出所对应的具体字符。

  所谓窗口单元固定属性,即由系统而非窗口单元本身提供支持的窗口单元属性。在窗口单元属性表中,被显示在以粗线条隔开的第二组属性中。固定属性与普通属性在程序中的使用区别为:固定属性在窗口单元被创建之前也能被程序所使用,而普通属性则不能。其列表如下:

1、 左边、顶边、宽度、高度:指定窗口单元的位置及尺寸。如果窗口单元为“窗口”,其位置值相对于屏幕的左上角,如果为窗口单元,其位置值相对于其所在窗口或者父单元的左上角。

2、标记:指定跟随于窗口单元的一段文本,用于在程序中取得或设置与该窗口单元相关联的数据。

3、可视:指定窗口单元是否具有可视外形。

4、禁止:指定窗口单元是否可以被操作者操作。

5、鼠标指针:指定鼠标移动到窗口单元上时的外形。

6、可停留焦点:设置当用户使用 TAB 或光标键在窗口上各单元之间移动输入焦点时是否允许在本单元上停留。

7、停留顺序:本属性必须在上一属性被置为真时才有效。用作设置用户使用 TAB 或光标键在窗口上各单元之间移动焦点时的顺序。当窗口被载入后,输入焦点将被交给具有最小停留顺序值的单元。