伪菜用ShioriAYA文的文档

上传人:沈*** 文档编号:45565687 上传时间:2021-12-07 格式:DOC 页数:43 大小:264.50KB
收藏 版权申诉 举报 下载
伪菜用ShioriAYA文的文档_第1页
第1页 / 共43页
伪菜用ShioriAYA文的文档_第2页
第2页 / 共43页
伪菜用ShioriAYA文的文档_第3页
第3页 / 共43页
资源描述:

《伪菜用ShioriAYA文的文档》由会员分享,可在线阅读,更多相关《伪菜用ShioriAYA文的文档(43页珍藏版)》请在装配图网上搜索。

1、AYA目录目录1何谓何谓 AYA.32环境环境.33使用规定使用规定.34汇出的函式汇出的函式.45基础设定基础设定.56AYA 脚本参照脚本参照.67函式函式.67.1基础基础.77.1.1_argc.77.1.2_argv.77.2语法语法.87.3自定义函式的定义与实行自定义函式的定义与实行.97.4字符串选择字符串选择.107.4.1不指定不指定 .117.4.2nonoverlap.117.4.3sequential.117.4.4void.127.4.5array.127.5子阶层子阶层.137.6输出确定子输出确定子.148値与变数値与变数.158.1即値即値.158.2变数变数

2、.168.3变量的范围与寿命变量的范围与寿命.179运算运算.189.1基本基本.189.2有括号有括号( )时的演算顺序时的演算顺序.219.3反馈运算符反馈运算符& .2210数组数组.2210.1简易数组简易数组.2310.2泛用数组泛用数组.2510.2.1初期化初期化 .2510.2.2数组元素的追加数组元素的追加 .2610.2.3数组元素的削除数组元素的削除 .2710.2.4値的更新値的更新 .2710.2.5値的取出値的取出 .2710.2.6无法多次元化无法多次元化 .2810.2.7演算演算 .2810.2.8函式的参数函式的参数 .2910.2.9分隔符分隔符/取得数指

3、定取得数指定 .3010.3范围指定范围指定.3010.4泛用数组的平行输出泛用数组的平行输出.3111字符串内埋入元素的展开字符串内埋入元素的展开.3211.1附带范围的展开附带范围的展开.3211.2名称最长一致展开名称最长一致展开.3412流程控制流程控制.3512.1if 的分歧的分歧 .3612.2case 的分歧的分歧.3712.3switch 的分歧的分歧.3812.4循环循环(loop).3912.4.1while .3912.4.2for .4012.4.3foreach.411 何谓何谓 AYA AYA 的日文即,汉字是文,由 umeici 制作的高机能SHIORI,由于采

4、用近似于 C 语言的写法,对于学过程序语言的人而言,特别容易上手。而对于没有相关背景的人格开发者,AYA 的作者也提供了基础的人格范本*1,只要经过少量的修改,便能成为一个全新的人格。AYA 主要执行下述处理:对提供的字符串进行加工 根据程序的规则生成字符串2 环境环境 Windows 用。开发的初期版本有经过 98SE、2000、xp 的动作确认,不过最终版本并没有在XP 以外的系统上作过动作确认。3 使用规定使用规定 利用规定(作者原文)使途限定自由利用出来。 (可以不限定用途的随意使用。)配布含自由取扱出来。一部、内容一部抜出、他构成含。 (可以自由运用发布文件包装中包含的全部文件。)(

5、取出一部份档案,或取出那个档案中的一部份内容进行二度制作也不介意。)使用结果、何损害発生、责任作者负。 (使用此程序后发生的任何问题,作者不予负责。)改変自由异版作成、配布出来。际、配布者意志基独自策定配布物适用出来。 (改变原始码并自行制成不同版本者,可自行发布。)(在此情况下,发布者能基于自己的意志自行制定适用于此发布物的认证。) 4 汇出的函式汇出的函式 文有以下被公开的函式。文利用、文 LoadLibrary?后关数実行所望处理行。extern C _declspec(dllexport) BOOL _cdecl load(HGLOBAL h, long len)文初期化指示。文 Lo

6、adLibrary?使用开始直前、关数一度必実行。h 文认识絶対、len h 长渡。 h 领域开放文侧行、呼出侧使放。extern C _declspec(dllexport) BOOL _cdecl unload()文终了指示。文 FreeLibrary?直前一度実行。extern C _declspec(dllexport) HGLOBAL _cdecl request(HGLOBAL h, long *len)文处理指示、结果得。h 处理対象文字列、*len h 长渡。渡 h 领域开放文侧行、呼出侧使放。处理结果戻値得。处理结果长*len 格纳(値书换)。戻値取得后、领域*len 示开放

7、(GlobalFree?)。此外,这部份和桌面应用软件伺使用的拟似 AI 用 DLLSHIORI的接口规格完全是相同的。5 基础设定基础设定 文 ver.5 的预设 DLL 档名为aya5.dll。主檔名aya5可以自由地改为别的名字。为了让文正常作动,被称为基础配置文件案的档案是必要的。基础配置文件案的文件名为主檔名.txt。即预设为aya5.txt。如果你把DLL 的文件名改为hoge.dll的话,基础配置文件案则为hoge.txt。基础配置文件案为 TEXT 文件、实行时以 OS 默认的文字编码来解读。若要考虑国际化方面的情况的话,为了回避关于多字节文字代码的问题、基础配置文件案最好是设

8、成 ASCII 编码。以下述为例:/ dicsdic, basis.dicdic, control./*doc*/ayc/ option parameterscharset, UTF-8msglang, englishlog, executelog.txtiolog, offfncdepth, 16设定时用逗号划分命令和参数。空行(只换行的行)、/后面单行文字、/*到*/包围的范围皆不会被读取。命令和其意义为如下所示:charset, name 标准文字编码的设定。从以下的预约值任意选择一个。 没有指定的时候则预设作为 Shift_JIS 处理。oShift_JIS / ShiftJIS /

9、SJIS 日文 Shift_JIS 编码。 oUTF-8 UTF-8。 odefault OS 默认的文字编码。 dic, filename 读取辞书档 filename。辞书文件为交付 AYA 脚本 作为程序源始码的文件,文会根据此程序的内容进行作动。辞书档指定多少,就能读取多少。filename 为 load 指定的路径位置的相对路径。标准的辞书文件是用 charset 指定的文字代码记述的平面文件。至于其他的,也可以用一定的法则来读取一些经过暗号化的乱码文件。msglang, language 选择 log 记录的错误讯息所使用的语言。从以下的预约值任意选择一个。 没有指定的时候则预设作

10、为 japanese 处理。ojapanese 日本语。 oenglish 英语。 log, logfilename 实行 log 档案 logfilename。能用 charset 指定的文字编码写入。logfilename 为 load 指定的路径位置的相对路径。iolog, on|off 设定是否记录 load、unload、request 实行时的输入输出数据、字符串及处理时间。on 为记录。预设为 on,不需要时请设为 off(节省系统资源)。fncdepth, depth 指定一数值限制函数调用的深度上限。预设値为 32。最低値为 2、比 2 还小或错误参数时也视为 2。6 AYA

11、 脚本参照脚本参照 AYA 脚本大致上的语法抄袭自 C 语言。若曾学过 C 语言,在学习类似于 C 语言的 AYA 时便易于理解。7 函式函式 7.1 基础基础 以下为 request 实行时能传回字符串Hello World的代码。 request Hello World 文读取此模块 HGLOBAL request(HGLOBAL h, long *len) ,实行此脚本后,便传回Hello World。load 与 unload 是同样的。但因为 load 与 unload 不传回值、所以即使写入输出字符串也没有意义。load 为代入变量的初期值进行初期化处理、相反的 unload 将处

12、理后的 code 写入。只要写必要的函式就好。不必要的则可省略。例如上例中的 load 和 unload 由于没有写入、因此也不会发生错误。仅仅是什么也没做。举个极端的例子、即使完全没有辞书档也不会发生错误。这种场合下 load 和unload 什么也没有做、 request 则传回空的字符串。load 和 request 有一个参数。可以用变量取出此值。变量的名字为_argc 和_argv、跟 C 语言的 main 函式的接口相类似。7.1.1 _argc 参数的数量。load 和 request 的参数是一个字符串,所以值为 1。unload 没有参数、因此值为 0。7.1.2 _argv

13、 参数的实体存在此处。此为具有_argc 个元素的数组。各元素中的存取地址为运算符i。序数 i 从 0 开始。例如_argc 是 2 的情况时可使用_argv0, _argv1,参数会储存在此。总结基础编的内容,load 将 Hello 收纳进变量 str, request 将作为参数交出的字符串与 str 结合后传回的程序代码显示出来。请以上述的说明为基础读读看。 load str = Hello request str + + _argv0 + ! 将处理对象字符串设为World交予 request 实行,可以得到 Hello World! 的结果。7.2 语法语法 有以下之例:1.空行(

14、只换行的行)、/之后、及/*和*/包围的范围不会被读取。 2.1 行的末端以斜线(/)作结时、下一行会与此行结合。 3.行头、以及单语间可自由放入空白文字。空白文字为空白及标记文字。 4.复数的叙述写在 1 行内的场合时、可以用分号(;)区别开来。也就是说先前举例的 Hello World 代码可以下列方式写在一行之中。 requestHello World那么像以下这样的写法可以吗?当然。运算上不会有问题。(但是这种写法不是很好看!) req/ uest / Hello World 斜线/的下一行(被重新结合的行)先头的空白文字会被判定为无效文字而消除。同样的以下字符串的结合结果为 ABCD

15、EFG 、不会是 ABCDEFG 。 ABCD EFG第 4 项说明。以下 request 为求 1+2 的答案、并传回句子。 request answer = 1 + 2 答案是 + answer + 的样子。 用分号的话可以写成以下这样。 request answer = 1 + 2; 答案是 + answer + 的样子。 分号过多时不会造成问题。它们会被无视,不影响运算的结果。相对的,如果你已经习惯 C 语言式的写法,也可以在每行的后面都加上分号。7.3 自定义函式的定义与实行自定义函式的定义与实行 除了 load、unload、request 以外也可以制作你自行取名的函式。写好函式

16、后,只要呼叫此函式即可使用。 request hello hello Hello World 上面表示的是最单纯的例子。request 的结果会传回Hello World。为了完成一些工作,大部份的函式会需要一个或者是更多的参数(parameter),而参数是让你可以传递一些数据到函式中。以下的例子可以得到与上述例子同样的结果。 request combine(Hello, World) combine _argv0 + + _argv1 函式名后面加入( ),并在内部以逗号分列数值,这样一来这些值会作为参数交给该函式。即作为变量_argv 和_argc 的值,可在此函式内被提取。在此举的例子

17、当中、combine 函式内的_argc 为 2、_argv0为Hello、_argv1为World。函式名可以自由取名,但不能与下列的规则相扺触。用数字 09 作为第一个字。 以下标线(_)为第一个字。 包含以下文字。 空白!#$%&()*+,-/:;?|与预约语完全一致。函式重复呼叫是可能的。举最常见的层乘计算式作为例子。 request factorial(5) factorial if !_argv0 1 else factorial(_argv0 - 1)*_argv0 request 传回 120。7.4 字符串选择字符串选择 request Hello World 你好世界 Ha

18、llo Welt 像这样的例子的话、这三个句子会被视为同等的输出候补、输出三者之中的任意一个。一共有 5 种选择方法,可以任意选择其中一种。然而, void 与 array 是为特殊用途而用的。7.4.1 不指定不指定 预设为随机选择。7.4.2 nonoverlap 在所有的候补都被选过之前,不会选择重复的选项。 request : nonoverlap Hello World 你好世界 Hallo Welt 像上列这样在函式后面附加: nonoverlap。7.4.3 sequential 上至下按顺予输出。输出到最后时,会返回先头。 request : sequential Hello

19、World 你好世界 Hallo Welt 像上列这样在函式后面附加: sequential。7.4.4 void 什么都不输出。以下的场合、request 3 个候补都不会输出。 request : void Hello World 你好世界 Hallo Welt 什么都不做与什么都不输出之间的差别请注意一下。函式内部的函式与算式仍然是会被处理的。 increment_i : void i+ i 上列函式中 increment_i 的 i 会进行 1 的加算。在没有 void 的场合下、此函式会传回加算的结果、在有指定 void 的场合下,不会传回任何的值,仅只是进行了加算的动作。7.4.5

20、 array 输出候补会全部集成一个泛用数组作为函式的返値。 request : array This is a pen. (A,B,C) 3.14 输出结果等同于泛用数组 (This is a pen., A, B, C, 3.14) 。nonoverlap 和 sequential 即使在具有输出确定子的情况下,也能取得所有的组合进行正常的运作。举 sequential 的例子来说: request : sequential 1 2 3 - A B request 会照以下顺序输出。 1A 2A 3A 1B 2B 3B 1A 2A 有时函式会使输出候补数量产生变动。例如以下的函式会因为变量

21、 i 的值而使候补数由 2 个变成 4 个。 request : sequential if i 1 2 3 4 当候补数产生变化后、nonoverlap 和 sequential 的巡回顺序会初期化,重新回到一开始的状态。唯有此时才有可能输出和上回相同的值。7.5 子阶层子阶层 request Hello World 你好世界 Hallo Welt 可以阶层式的重复书写。其中变化与最高层的 相同,会在包含其中的候补挑选一个输出。但只能以随机的选择方法,无法像最上层那样指定 nonoverlap 或 sequential。从上述来看, 的有无似乎是一样的,但实际上不是这样。在没有 的场合、输出

22、的机率大约是平等的 1/3。然而在上述的例子看来、首先会从Hello World与你好世界之中挑选一个出来、然后挑选出来的再与Hallo Welt进行二选一。所以说,三者的出现率为Hello World与你好世界为 1/4,Hallo Welt为 1/2 这样。7.6 输出确定子输出确定子 request Hello Perfect Peaceful - Wor - ld th -作为输出确定子,会将选择候补的范围切开来分成各自的小组。然后,将各小组选出来的结果互相结合。如果实行上述的 request 的话,会产生下列任一种结果。 Hello World Perfect World Peace

23、ful World Hello Worth Perfect Worth Peaceful Worth与 nonoverlap、sequential 组合使用的场合下,(单位)函式会根据取得的所有组合进行相对的动作。输出确定子在任何地方都可使用,即使在 很深的情况下。文也能处理同时有字符串与数値的情况。输出确定子会在结合时全部转换为字符串与字符串的结合。8 値与变数値与变数 8.1 即値即値 文能处理的值为整数、实数、字符串 3 种类。整数 带符号 32bit 整数。一般为 10 进位数値。在前头附加0b的话、可记述 2 进位数値。在前头附加0 x的话、可记述 16 进位数値。以下的函式 int

24、10 会传回整数 10。因为 3 种记述方式以 10 进位来看都一样是10。 int10 10 0b1010 0 xa 实数 带符号 64bit 浮动小数点数。数值在小数点以下的场合、或是精确度落差非常巨大的场合时可以使用这个。与整数的差别在于小数点的有无。文在数值上有小数点的时候,会作为实数处理。字符串 双引号()包围的値为字符串。字符串中不可含有双引号。字符串(无展开) 单引号()包围的值,不进行展开动作的单纯字符串。文能在字符串中插入变量或函式的这个功能,是在有展开被双引号包围的字符串才有。字符串中不可含有单引号。8.2 变数变数 变量为保存值的领域。变量可以保存:整数、实数、字符串 可

25、以保存上述三者的泛用数组上述的这几种。名字在不触犯以下禁止条款的前提下可自由设置。以数字 09 为始。 包含以下文字。 空白!#$%&()*+,-/:;?|与预约语完全一致。 与函式名完全一致。値的保存(指派)由指派运算符 = 来执行。要输出内容的话、与函式一样写下变数的名字即可。 request str = 你好 str 上面为最单纯的例子、变量 str 存取字符串、并照着那样输出。若是未指派值的变量,则会输出空的字符串。注意并不是什么也不输出。 request Hello World i i 并不存在,因此为空的字符串,结果上面的例子与下面的写法等价,因此有1/2 的机率会输出Hello

26、World或空字符串。 request Hello World 8.3 变量的范围与寿命变量的范围与寿命 变量有两种不同的 scope(有效范围)。全局变量(global variable)所有函式皆可共通使用的变量。寿命为永远。局部变量(local variable)现在的 内、以及其下更深的子阶层可以使用的变量。寿命为当此 结束的时候。两者的区别为变数的名字。变量名前头有下标线(_)的变数为局部变量。以只在必要范围内有効的变量的观念善用局部变量的话、可以有效提升程序的质量。 request _i = 3*2 等于 _j = multi(3) _i +_j + 的样子 multi _i =

27、_argv0 _i * 2 request 与 multi 虽然使用了同样名字的变量 _i,但两者被视为完全无关的值来运算,也不会互相干扰。你或许也察觉到函式的参数所使用的变量_argc 和_argv 同样也是局部变量。这也是因为其他的函式也都需要存取一些不同的值,所以才将其作为局部变量。局部变量并非是在现在的函式内可以使用的变量,而是现在的 内、甚至更深的阶层都可使用的变量,这点请注意一下。 request _str = Hello World _str 这个程序无法照着我们希望的那样动作。_str 在 内是有效的、但是到了输出取值的时候却消失了。结果,这个函式 request 输出的是空字

28、符串。要正确产生结果,则应该预先宣告变量。如下所示: request _str = _str = Hello World _str 全局变量与局部变量的差异就在这里。就是寿命。照上述所说局部变量的规则、变量在现在使用的 之外便会消失。相对的全局变量在哪里都可使用、此外 unload 后此值会被自动储存在档案里面,等到 load 后又可再度复元。意即全局变量的内容(在没有特别的操作或意图使其消去的前提下)是可以永久保存的。9 运算运算 9.1 基本基本 与 C 语言同様写法的四则运算、比较运算、指派、及其他可能的运算。演算顺序为当运算符重复堆栈时基于演算优先度来决定的。还有、括号( )包围的部分

29、为最优先演算顺序。运算符的种类与演算优先度如下。运算符意义优先度( ) 括号高!否定*+-递增*/递减*/%乘除算、除余+-加减算&反馈*=!=_in_!_in_比较&论理积(注)论理和=:=指派+=-=*=/=%=+:=-:=*:=/:=%:=,=演算并指派,泛用数组要素的列举低(注)论理和为 |附有冒号(:)的指派运算符乃因旧有版本的兼容性而保留的,功能上与没有冒号的指派运算符完全相同。*为一元运算子。括号( )相关内容会在次项中详细说明。逗号运算符(,)、方括号 会在数组的项目中详细说明。反馈运算符&会在别项中详细说明。_in_与!_in_为字符串中包含校验功能的运算符。 foo or

30、_in_ World _in_ 若左边字符串在右边字符串中有相符字符串的话传回 1、如果没有的话传回 0。!_in_为相反。上述函式 foo 传回 1。比较运算符的结果是真时传回整数 1、伪时传回 0。这些运算符同样也适用于字符串。値的大小则根据辞书顺序的比较来决定。逻辑真伪的判断。伪整数 0、实数 0.0、空字符串、空泛用数组真上述以外的全部值没有指派的运算会直接输出结果。 foo (3+2)*4 此函式 foo 最后会输出 20。同样优先度的运算符连续出现的场合下,通常由左开始结合。 1+2-3例如上式为 (1) 1+2 (2) 3-3 的顺序进行计算。 i = j = 10至于这种例子又

31、怎么说呢?因为 C 语言的指派运算符为由右至左的演算,所以 i 与 j 都被指派了 10 的值。 然而文在结合时常由左边开始。即 (1) i = j (2) j = 10 这样的顺序计算下去。结果、i 无法变成 10 的值。 i = (j = 10)改成这样写的话 i 就可以得到 10 的值了。演算对象项目的型别不一致的场合下、最终结果的型别如下列所示。整数与实数的演算 结果为实数。整数/实数与字符串的加算 数値转换成字符串后、再与字符串结合。整数/实数与字符串的演算(加算以外) 无法演算但也不会产生错误。结果为空字符串。即使在一个演算式内混合多种的型别也没关系。必要的话、会根据上述法则产生型

32、变。 10+2 等于 + (10+2) + 的样子。一开始是 10+2 的整数计算,得到的值为 12。接下来为所有字符串的加算,12转换成字符串,作为字符串组合在一起。9.2 有括号有括号( )时的演算顺序时的演算顺序 括号( )包围的部分为演算顺序中最优先展开的。( ) 可以任意重复指定、愈深的优先度愈高。平白的说就是从包围最深的地方先开始计算。因为这是理所当然的规则,所以也不用特别在意。不过按照数式的写法也是可以弄得非常复杂的。以以下例子来看。 answer = (_i = 10) + (2*(_i + 10)对于不理解文的算法则的人来说,很难保证 answer 会是怎样的值吧。answe

33、r 其实是字符串的10。绝对不是整数 50。最初的计算在哪?括号最深的地方、也就是 _i + 10 。那么变量 _i 还不存在,因而变成空字符串。再来、_i + 10 为字符串与整数的加算。10 也变成字符串、也就是10。但是接下来为与整数的乘算、结果又变成了空字符串。说到这里应该明白为何是字符串的10原因了吧。那么、这边的意图首先是让_i = 10 的指派成为最初的演算。像这种时候、文的方法即为追加更多的括号来控制演算的顺序。 answer = (_i = 10) + (2*(_i + 10)这样一来指派的优先度就大为提升。这响应该便能得到正确的结果了。然而,如果你以为将括号加到第 2 层即

34、可的话,那你又错了。括号 2 段的话虽然与 _i + 10 同样深度,但是 = 与 + 相比优先度是 + 的那边较高。9.3 反馈运算符反馈运算符& 反馈运算符&是用法完全不同于别的运算符的独特运算符。 request _i = 1 foo(&_i) foo _argv0 = 100 呼叫函式时将变量作为参数的时候、可以在变量的前面加上&。前头附有&的变量可以与原先叫出函式相对应的_argv 的元素产生关联。也就是说、当_argv 的值改变的时候、其对应的原呼叫变量的值也会改变。就上面的例子、foo 实行后 _i 的値也会变成 100。反馈运算符可以自由的在不同地方多次使用。 request

35、foo(1, 2, &_value, Hello, &_value2) _value + _value2 foo _argv2 = _argv0 + _argv1 _argv4 = _argv3 + World 函式 request 最终传回 3Hello World 。当然的、反馈运算符只能使用在变量上面。10数组数组 运算符 为用于存取数组元素的运算符。数组分为在字符串区分元素来拟似数组型式的简易数组,以及以逗号区分、详细列举数组元素的泛用数组这两种类。10.1 简易数组简易数组 将字符串中含有的逗号视为分隔符(划分的符号),并像数组般进行处理。简单的说,简易数组其实就是字符串,只是用了类

36、似处理数组的方式进行演算。 request _a = this,is,a,pen _a1 request 最后输出is。 运算符处理的对象并不一定是变量,即値与函式的返値也是可以的。上述例子也可写成如下例这样。 request this,is,a,pen1 在 运算符中的第二项参数可以自行指定分隔符(delimiter),用逗号以外的文字作为划分数组元素的根据。 request This,is,a,island.2,is 上述即以is来进行区分,字符串最终会被分解成这样。 0Th 1, 2,a, 3land.request 因而传回,a,。如果善用分隔符的话,要做出类似多次元数组格式的值也是有

37、可能的。 request _ar = taro|male,ayame|female,hotaru|female _ar21,| _ar2即为hotaru|female。接下来再将|作为划分文字将hotaru|female中的1取出的话、结果即为female。像这样每个阶层都使用独特的分隔符的话,便可以轻松取得任意位置的值。当你指定范围以外的序数时,会跟取出不存在的变量的情况一样,传回的值为空字符串。这边开始为变量才能使用的功能。可以指派数组元素。 request _a = this,is,a,pen _a3 = eraser _a pen会被替换成eraser。request 的实行结果为th

38、is,is,a,eraser。在有指定分隔符的情况下也能正常运作。 request _s = This,is,a,island. _s2,is = ,beautiful, _s request 会输出This,is,beautiful,island.。在与多次元数组 运算符链接使用的时候,则无法指派( = )运算符。 request _ar = taro|male,ayame|female,hotaru|female _ar11,| = male 上述式子想把 ayame 的性别改为 male,但却会发生错误。只有在一次元的情况下才能指派。指派的位置即使超过现有的元素数量也没关系。分隔符会自动

39、追加,扩张元素数量。 request _m = fuji/asama/tanigawa _m5,/ = daisen _m request 会输出fuji/asama/tanigawa/daisen。如果使用叫做 SETDELIM 的函式的话,便能将预设的分隔符从逗号改为其他的字符串。上述例子如果用 SETDELIM 来写的话,会变成下面这样。 request _m = fuji/asama/tanigawa SETDELIM(_m, /) _m5 = daisen _m 运行 SETDELIM 之后,只要写_m5即可。在与多次元数组 运算符链接使用的情况下、SETDELIM 只对最初的(一次

40、元的) 有効。10.2 泛用数组泛用数组 泛用数组是可以保存各种不同型别的值的数组构造。一般的访问速度要比简易数组快得多。10.2.1初期化初期化 i = (100,test,-1.5)用逗号列举数组元素并记述。在指派的时候请像上面一样将元素的集合用( )围起来。因为逗号的演算优先度低于指派运算符( = ),如果没有这么做的话会被 (i = 100),test,-1.5这样子解释。要使数组呈现无元素状态的初期化,请使用 IARRAY 这个函式。IARRAY 为会传回空的泛用数组的函式。 i = IARRAY初期化时如果只有指派一个数组元素时得另外做点功夫。假如只有指派 i = 100的话,因为

41、不是数组的关系,会被视为单纯的指派 100 的值。请照下述方式记述。 i = (IARRAY,100)10.2.2数组元素的追加数组元素的追加 i = (i,add)这样写的话会在数组 i 的后端追加add这个元素。也可以追加数组。 i = (i,(add,123,0.0)就像 a = a + 1 同等 a += 1 这样的省略法,上述例子也可以写成像下面这样。 i ,= (add,123,0.0)也可以在数组的前端插入元素。 i = (first,i)也可以在数组的中间插入元素。 i = (100,200,300,400,500,600) i2 ,= insertioni 即为(100,20

42、0,300,insertion,400,500,600)。要注意的是插入的值是追加在 i2的后面,所以当你要取这个值的时候不是取i2而是取 i3。想插入 i2的位置的话请 i2 = (insertion,i2)这样子写。10.2.3数组元素的削除数组元素的削除 将要削除的元素指派给 IARRAY。 i = (100,200,300,400,500,600) i2 = IARRAY300 于是被削除、i 变成(100,200,400,500,600)。10.2.4値的更新値的更新 可以单纯的指派元素。 i = (100,200,300,400,500,600) i2 = 700i 变成(100,

43、200,700,400,500,600)。指派的位置即使超过现有的元素数量也没关系。数组会自动扩张元素数量。10.2.5値的取出値的取出 与通常的变量一様,被指定的元素若存在便输出此数组元素。当你指定范围以外的序数时,会跟取出不存在的变量的情况一样,传回的值为空字符串。 i = (100,200,300,400,500,600) i4最后输出 500。 运算符处理的对象并不一定是变量,即値与函式的返値也是可以的。 (100,200,300,400,500,600)4最后输出 500。泛用数组也可直接作为函式并输出。 request river2 river tenryu,bandou-taro

44、u,ishikari,shimanto request 会输出ishikari。10.2.6无法多次元化无法多次元化 泛用数组无法组合成多次元数组。 (100,200,(300,400),500,600)用这样的写法时,括号内包的部份并不会被视为第二次元的数组。结果像以下一样单纯的结合。 (100,200,300,400,500,600)10.2.7演算演算 元素单位的演算一般来说是可以的。比较独特的是,泛用数组的单项値在演算的时候,是 全元素的单项値都进行演算。 pref = (gunnma,ohsaka,hokkaido) pref += -ken answer = (2*(1,2,3)1

45、pref 会变成 gunnma-ken,ohsaka-ken,hokkaido-ken 。answer 的结果是 4。2*(1,2,3)的计算结果为(2,4,6)。10.2.8函式的参数函式的参数 在文的体系中,函式的参数为泛用数组。_argv 的内容即为函数调用时所代入的参数。也就是说 func(1, 2, test)与这样的函数调用、 _i = (1,2,test) func(_i)都可以写入。这是相当重要的记述。请注意,这个 script 在运行的时候,参数的数量绝对不是 1 个。而是 3 个!此时 func 内_argv0 = 1,_argv1 = 2,_argv2 = test。善用

46、这种构造的话,可以从其他的函式中简单的取得可变长的参数。 request total(1,2,3,4,5,6) total calc_total(_argv) calc_total _answer = 0; foreach _argv; _val _answer += _val _answer total 本身完全没有做什么事,只是单纯的将所有的参数传给 calc_total。这例子是单纯的传递,当然也是可以在此过程中经过必要的加工后再传递。参数的指定方法较为复杂的情况下需要注意几点。 _i = (1,2,test) func(sky, _i, sun)上述的呼叫与下例同等。使用泛用数组时请记

47、得它无法多次元化。 func(sky, 1, 2, test, sun)10.2.9分隔符分隔符/取得数指定取得数指定 _i = (2,is) This is a island._i简易数组在指定分隔符的部分也是泛用数组。所以也能像上述这样子写。与下述写法为等价。 This is a island.2,is10.3 范围指定范围指定 简易数组/泛用数组都可指定序数的范围,也可以取得或代入。范围可用泛用数组来指定。例如 ia,b 可表示为i 的元素 ab。 name = (,奈留,毒子,美耳) i = name1,3 name3,4 = 奎子 j = name name0,2 = IARRAY

48、k = namei 变成 (,奈留,) 。j 变成 (,奈留,奎子,美耳) 。k 变成 (奎子,美耳) 。范围外则自动无视。 n = (1,2,3,4) n-2,1 *= 5n 为 (5,10,3,4) 。对象是简易数组的时候也是一样。 name = ,奈留,毒子,美耳 i = name1,3 name3,4 = 奎子 j = namei 为 ,奈留, 、j ,奈留,奎子,美耳 。指定范围后再接着指定分隔符也是可能的。 animal = 熊!兔!猫!狗!鳄 i = animal0,2,! animal2,4,! = 猪 j = animali 变成 熊!兔!猫 ,j 变成 熊!兔!猪 。10.

49、4 泛用数组的平行输出泛用数组的平行输出 所有的式/値的前面都可写上parallel。具有 parallel 的泛用数组在作为输出候补値的时候,能将数组中所有的元素视为输出候补値。 foo0 (A,B,C) 地球 foo1 parallel (A,B,C) 地球 foo0 的输出会是(A, B, C) 或 地球。foo1 的输出会是A、B、A、地球 这四种。把 parallel 用在泛用数组以外的值的时候,有写跟没写一样。例如下面的 2 种写法是等价的。 parallel STRLEN(earth) STRLEN(earth)在使用字符串选择模式 array 和 parallel 的时候,可以

50、与函式的输出候补和泛用数组互相配合使用。可以有各式各样的应用方式。例如以下非常简洁的函式 cyclic,会把泛用数组的所有元素按照前后顺序取出来。 request _i = (甲,乙,丙) cyclic(_i) cyclic : sequential parallel _argv 11字符串内埋入元素的展开字符串内埋入元素的展开 可以在字符串的中埋入变量或函式,并把实行的结果插入其位置上。11.1 附带范围的展开附带范围的展开 将埋入的元素以%( )包围。 request _i = pen This is a %(_i). request 实行后,会输出This is a pen.。%( )会

51、进行类似 eval(将字符串解释为 Script code 并实行)的动作。可以是单一的函式或变量,甚至是算式也没问题。 request 1+2+3 等于%(1+2+3)。 request 会输出1+2+3 等于 6。请注意,文的字符串中无法包含双引号,因此不能插入含有字符串的算式。以下例子会产生错误。 request This is a %(_i = pen). 像这种时候,要将算式区隔出来。 request This is a + (_i = pen) + . 有括号( )的演算顺序控制与附带范围的展开是同様的程序。 请看以下的例子。 request 行星%(_i = planet)离 e

52、arth 很远。这个行星的颜色是%(color(_i)。 planet mars saturn pluto color case _argv0 when mars; red when saturn; yerrow when pluto; blue others; unknown 由于最深的( )为 color(_i)的参数,所以会在执行_i = planet 之前就先呼叫函式color。 在这种情况时,请增加额外的括号来调整演算顺序。 行星%(_i = planet)离 earth 很远。这个行星的颜色是%(color(_i)。这样一来即可得到没有矛盾的字符串。11.2 名称最长一致展开名称最

53、长一致展开 没有授与( )时、单纯埋入%时所展开的机能。 request o = pen obj = eraser object = world This is a %object. obje television 其展开的对象为%后面的字符串中相符并具有最长一致性的变量/函式。在上面的例子中,一致性最高的变量为 object,因而采用此变量。结果会变成This is a world.,而不是This is a televisionct.或This is a eraserect.。由于变量时时刻刻都在作成与消失,因此展开的对象也会根据状况而有所变化。这是附带范围的展开时所没有的特性。 requ

54、est val = red trans - value = blue trans trans %value trans 被实行了两次,然而第一次与第二次的%value的动作是不一样的。此意味着最初的运行被视为变量 val+ue,第二次则被解释为变量 value。request 会输出redueblue。使用% 语法的话可以呼叫过去的展开结果。 request %planet很远。%city也很远。不过%0比%1更远。 planet mars saturn pluto city newyork moscow madrid %i 为从 0 开始的第 i 次展开结果。也就是说在上述的例子中,%0 会

55、显示 %planet 的展开结果,%1 会显示 %city 的展开结果。% 在附带范围的展开中无法使用。想要再利用附带范围展开的过去结果的话,请使用变量。由于名称最长一致展开在运行过程中会对展开的对象进行检索,所以和附带范围展开相比,动作速度上会慢上很多。因此在没有必要的时候,请使用附带范围展开%( )。12流程控制流程控制 12.1 if 的分歧的分歧 式的判定结果为真时则继续处理 内的式子。 request if !i i 为 0。 可以在后面加入 elseif。会在 if 的判定为伪的时候进行处理。elseif 可连续使用。另外,ifelseif 的最终端可加入 else。会在前端 if

56、 及 elseif 的判定皆为伪的时候进行处理。 request if !i i 为 0。 elseif i = 5 i 为 5。 elseif A _in_ TOUPPER(i) i 为字符串,并且含有 a 或 A。 else i 不是 0 或 5 或含有 a 的字符串。 if、elseif、else 在处理 script 时若只有一行的话、 可省略。因此上述程序代码可写成如下所示。 request if !i i 为 0。 elseif i = 5 i 为 5。 elseif A _in_ TOUPPER(i) i 为字符串,并且含有 a 或 A。 else i 不是 0 或 5 或含有

57、a 的字符串。 但是在 if 重迭的时候 不可省略。以下式子在 C 语言中是正确的,在文中是错误的。 if i = 0 if j = 0 i 和 j 都是 0。以下式子的 是必要的。 if i = 0 if j = 0 i 和 j 都是 0。 和 C 语言一様,if 的判定式可以用括号( )将全部式包围住。其运作和不包围的时候没有两样。可以使用 if、elseif、case、while、for、switch 的判定式。12.2 case 的分歧的分歧 case 可实现条件分歧的构造。 request case i when 0 i 为 0。 when A i 为字符串 A。 others i

58、不是 0 也不是 A。 case 会实行与判定式结果一致的値所对应的 when 片段。others 在代入的值与所有条件叙述的值都不一致的时候才会执行。others 可以被省略。when 可以用逗号列举两个值以上的条件叙述。另外也可以用减号-来指定条件的范围。 request case name+(i+1) when Pentium3,Pentium4 Pen!在 1999 年发售,而 Pen4 则在 2000 年发售。 when Pentium5-PentiumX 还没有。 others 我不知道。 when 所记述的条件式必须是即值,不能含有变量或函式、运算符。when、others 在处

59、理 script 时若只有一行的话, 也可像 if 一样省略。12.3 switch 的分歧的分歧 当你想要自行选取 内的输出候补的话,使用 switch 的话即可指定输出候补的位置。 request switch id id 为 0。 id 为 1。 id 为 2。 id 为 two。 id 为 3。 会依照变量 id 的値来指定输出的字符串。指定的值从 0 开始。id 为 2 的时候,会输出id 为 2。或id 为 two。在此 所包含部分的选择为随机。当 switch 的参考值所对应的候选不在 内时输出空字符串。例如说、在上述例子中若 id 等于 100,便会输出空的字符串。当 swit

60、ch 内含有输出确定子( - )的时候,会选择各小组在此值所配对的输出候补。 request switch 1 天才 - 言难 - 。 。 request 的输出会变成天才。中间的小组因为指定位置没有候补,所以输出空的字符串,这点请注意一下。12.4 循环循环(loop) 共有 while、for、foreach 这 3 种循环构造。12.4.1while while 是最简单的循环形式,当条件为真时会重复执行 内的动作。 request _i = 1 _j = 0 while _i 11 _j += _i _i+ 将 1 到 10 全部加起来的话,可得到%(_j)。 上面的例子可以简单说明

61、while 的功能。下面的例子会产生 10 个不同的字符串。request 的输出结果为报告 110 其中任一个数的平方根的字符串。 request _i = 1 while _i 11 %(_i)的平方根为%(SQRT(_i)。 _i+ 12.4.2for for 是与 while 同様的先判定循环构造,其特色在于会在循环开始前指定其初期化式、脱出判定式、循环执行式。while 的例子用 for 来写的话可写成下面所示。 request for _i = 1; _i 11; _i+ %(_i)的平方根为%(SQRT(_i)。 _i = 1 会在循环开始前执行。_i 11 为循环的条件式、如果

62、条件为真时则循环继续执行。_i+会在循环执行完一轮之后、开始新的一轮之前的时候执行。C 语言可用 for ( ; ; ) 作为无限循环,文的话各式的省略不可。制作无限循环的时候, for 1;1;1请这样子写。不过,用 while 的话 while 1这样子写就行了。因此文在制作无限循环的时候,不管是从可读性或是动作速度的角度来看,都建议使用 while 循环。12.4.3foreach 照顺序取出简易数组或泛用数组的各元素値。以下例子为取出简易数组的元素进行数值的转换,再将这些数值全部加起来后输出其结果。 request _str = 1,3,5,7,9 _t = 0 foreach _str; _i _t += TOINT(_i) _t foreach 会持续

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!