aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 125755|回复: 43

aardio 之特殊符号用法大全

  [复制链接]

42

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2013-11-25 17:54:52 | 显示全部楼层 |阅读模式
本文供初次接触 aardio 的用户快速的了解 aardio 特殊符号最基本的用法。
+ - * / 这些较通用的操作符下面不会列出,请参考《 aardio 语法与使用手册 > aardio 语言 > 操作符 》

{} 表构造器、语句块标记
{} 可用作包含语句块的首尾标记,语句块一组顺序执行的语句组成,并可创建独立的局部变量作用域,局部变量拥有最高的存取优先级,查找同名变量时将优先搜索当前语句块的局部变量,例如下面的代码创建了多个语句块:

import console;

//创建函数体
func = function(cond){
   
var v = 1; //声明局部变量
   
   
//条件语句
    if(cond){
        
var v = 2; //声明局部变量
        console.log(v);
    }
}

func(
true);
console.pause(
true);

{} 在表达式中用于构造表对象是 aardio 中唯一的复合数据类型,
即可用作哈希表,也可以同时包含有序数组、稀疏数组等成员。声明字段的静态类型时 —— 还可以表示结构体

表中默认用 ; 号分隔成员( 可用逗号替代 ),默认用 = 号分隔键值对成员(非结构体字段可用 : 号替代 ),示例:

var object = { name1 = "abc"; name2 = 123 }
var object2 = { ["name1"]="abc", ["name2"]=123 }
var object3 = { name1:"abc", name2:123 }
var object4 = { "name1":"abc", "name2":123 }
var array = { 1;2;3 }
var array2 = { 1,2,3 }
var objectAndArray = { name1 = "abc"; name2 = 123; 1;2;3 }

虽然在 aardio 中以上构造表的语法都是正确的,但一般建议大家使用 ; 号分隔元素,并使用 = 号分隔键值对。

.  成员操作符
用于访问对象的成员,
例如 io.file 表示 open 函数是 io对象的成员( 这里是名字空间成员 )

.. 全局成员操作符
这个操符符用在自定义的名字空间里访问全局名字空间 global;
例如 ..import console 实际上等价于 global.import console

:: 全局常量操作符
这个操符符用于将一个变量名转换为 global名字空间下的全局常量名 - 并保护该常量在其后加载的代码中一旦赋为非空值后即不可修改,例如:
::Kernel32 := raw.loadDll("Kernel32.dll");

全局常量需要遵守以下使用规则
1、全局常量名首字母大写(以区别普通变量 )。
     aardio默认定义了少量全局常量函数名 - 这些关键函数全部小写首字母,但在aardio编辑器中显示为蓝色高亮状态。

2、
当一个变量被定义为全局常量,赋于非空值以后其值即不能再随意更改 。
     全局常量一般使用 ::Name := 初始值 赋值,等价于使用 ::Name = ::Name or 初始值  以避免重复初始化。

3、::的作用域是根据代码的载入顺序向下向后的,所以在同一文件中已定义的全局常量名时再次使用可以省略::前缀,但因为代码文件的载入有不确定性 -  在其他文件首次使用该常量名时仍然应该使用::定义一次。

# 计数操作符
# 操作符 在一个数组前面时返回数组长度,在字符串或buffer对象前面时返回字节数。
注意Unicode/UTF16/UTF8字符串用#取到的都是字节数而不是字符数,UTF8字符串使用string.len()函数可以获取字符数,而UTF16字符串只要简单的用字节数除以2就可以得到字符数。

如果 #在一个单引号包含的字符后面,计算并返回字符的ASCII码,例如
'a'# 返回 数值97

当#放在数字中间时,用来表示自定义进值,例如
2#101 表示2进制的101

[ ] 下标操作符( 或者叫索引操作符 )
也是用来访问对象的成员,中括号里面应当是一个合法的表达式。
例如 io.file 用索引索作符来表示就是 io["open"]
        
. 成员操作符 这里的成员名字不需要放到引号里,并且必须是一个合法的变量名。
但索引操作符就不同了,可以放任意的表达式,例如 io[ "o" + "pen" ] 这样写也是可以的。
        
另外一个区别:当你使用索引操作符调用成员函数时,被调用函数的 owner 参数为空。
所以一般不应当这样写 io["open"]() ,而应当写 import console

下标操作符也可以用于字符串、或buffer对象,返回的是指定位置的字节码(数值),例如:

import console;
var str = "test测试"
var wstr = 'Unicode/UTF16宽字符串'u
var buf = raw.buffer("abc测试");
console.log( str[1], wstr[1], buf[1] );
console.pause(true);

要特别注意的是:
Unicode/UTF16字符串使用下标操作符返回的是宽字节码(2个字节组成的16位数值)。
如果需要返回字符而不是字节码,需要改用下面会讲到的直接下标操作符 [[ ]]

[[ ]] 直接下标操作符
这个操作符与 [] 的用法基本是一样的,
唯一的区别是他不会触发元方法,所以数组里实际有这个成员就是有,没有就是没有,忽悠不了这个操作符。

这个
直接下标操作符可以应用于任何类型的对象( 包括null空值 )不会报错,
如果对象不包含直接下标操作符中指定的成员就简单的返回 null空值。所以[[]]即可以用来取值同时又可以方便的检测对象类型,例如:

if( 可能为空或任意类型的变量[["test"]] ){
        console.log(  可能为空或任意类型的变量[[
"test"]] )
}

不要小看这个操作符 - 使用频率非常高,而且可以节省不少的代码。
最近Javascript, Typescript里一个炒的很火的新语法“可选链”跟这个直接下标有点像,解决的也是类似的问题,实际上 aardio十几年前就有这些了。

将普通下标操作符用于字符串时, []操作符取的是字节码、是个数值,而 [[]] 取出来的是字符。
例如定义字符串变量 str = "abcd" 这时候 str[1] 是他的ASCII码97,而str[[1]]则返回字符"a"

对于Unicode/UTF16字符串,[ ] 操作符取的是宽字节码( 以2个字节为单位的16位数值 ),而 [[ ]] 操作符返回的是宽字符( 也是以2个字节为单位的单个Unicode字符 ),但使用 #取长度时就总是返回字节长度 - 这个要注意区别,下面看一个完整例子。

import console;
var ws = 'abc中文'u;

for(i=1;#ws/2 ){
    console.log(
"Unicode字节码", ws[ i ], "Unicode字符",ws[[ i ]] )
}
console.pause(
true);

@ 元表操作符
这个操作符表来读取或设置对象的元表, 关于这个请查看帮助文档
一个简单的示例

var tab = { a = 123 };

tab@ = {
    _get =
function(name){
        
return "有木有:" + name;
    }
}

import console
console.log( tab.a )
// -> 显示123
console.log( tab.b ) // -> 显示"有木有:b"
console.log( tab[["b"]] ) // -> 显示 null空值
execute("pause")

@ 在模式匹配里还有特殊用途。
如果一个模式表达式的第一个字符是‘@’,表示全局禁用模式语法执行普通的二进制匹配。
如果一个模式表达式的第一个字符是两个'@@',同上表示禁用模式语法并且执行文本匹配(不会截断宽字符。)
也可以在模式表达式的尖括号中使用一个'@" 或两个 '@@' 表示局部禁用模式语法( 两个‘@@’ 表示启用文本匹配,并且忽略大小写 )

示例如下:
var  str = "abc\d测试字符串"

//模式匹配
var i,j = string.find(str,"\\d")

//禁用模式匹配
var i,j = string.find(str,"@\d")

//禁用模式匹配、且启用文本匹配
var i,j = string.find(str,"@@\d")

//局部禁用模式匹配
var i,j = string.find(str,"<@\d@>:+")

//局部禁用模式匹配、且启用文本匹配、并且忽略大小写
var i,j  = string.find(str,"<@@\D@>:+")   

_ 下划线

如果在一个成员变量的前面加上下划线,则声明该变量的值为只读,在赋值后不可修改
例如 _version = 123 你就不能在后面再修改为 _version = 456, 这种习惯在其他编程语言中通常只是一种书写习惯,但是在aardio则是语法级别的强制约束。

如果下划线后面的变量名全部大写,则表示全局只读的常量
例如 _VERSION = 123 表示他在所有名字空间都有效

另外数值的字面值允许加入下划线作为数值分隔符,
例如 123_456 等价于 123456, 2#1010_1100 等价于 2#10101100,
数值分隔符不能使用连续多个下划线,并且不能在字符串中使用数值分隔符,例如:

tonumber("123_456") 返回的是123
("123456") + 1 返回的是一个数值 123457
("123_456") + 1 会报错

“\”,"/" 应用程序根目录

在 aardio 中文件路径如果以单个斜杆或反斜杆开始表示『应用程序根目录』

『应用程序根目录』指启动程序文件所在目录,在开发时指 aardio 工程目录,在发布后指启动 EXE 目录。

如果启动文件在工程外部,或者当前没有打开工程,则以启动文件所在目录为 『应用程序根目录』。

如果在开发环境中运行没有保存的 aardio 代码,则仍以当前工程根目录为『应用程序根目录』,如果没有打开工程,则以 aardio.exe 所在目录为 『应用程序根目录』。


“~\”,"~/" EXE 目录

在 aardio 中如果文件以 "~" 右单个斜杠或反斜杠开始表示启动EXE 所在目录

如果没有生成 EXE ,在开发环境中直接运行代码,EXE 目录指的是 aardio.exe 所在目录。

注意单个 “~” 作为数值位运算符使用时表示
按位取反

$ 包含指令符
这个包含符号挺有意思,
只要在文件路径前面加上这个符号, 就会将该文件编译为一个普通的字符串对象.
例如  str = $"e:/我的图像/x.jpg" ,在程序发布后,程序即可脱离原来的文件运行,因为该文件已经被编译为一个普通字符串变量并内嵌到EXE中了。

如果$包含的文件路径以"~/"或"~\"开始,并且查找文件失败,
aardio会移除路径前面的~,转换为"\"或"/"开头的应用程序根目录路径继续查找。
应用程序根目录在开发时指工程根目录(工程之外的aardio文件指启动aardio文件所在目录)。

反之,如果包含的文件以"/"或"\"开始,并且查找包含文件失败,
aardio不会在路径前面添加"~"到EXE目录下查找(EXE目录在开发时指aardio开发环境所在目录)。

默认如果找不到包含文件会报错,但是如果包含文件路径前面添加一个问号,
找不到文件时不报错而是返回null,例如: str = $"?找不到的文件"
在aardio编辑器里,只要将资源管理器里的文件直接往编辑器里一拖就行了,会自动加上这个包含指令符。

++ 字符串连接操作符
在 aardio 里 1 + 2 的结果是数值3( 好像是废话哦 ),
1 + "" + 2 的结果是字符串 "12" 这个不难理解吧?

上面的 + "" + 可以直接缩写为 ++
也就是说 1 ++ 2 的结果就是 字符串 "12"

实际上一个加号也可以连接字符串,例如:
"1" +  "2" 的结果是 字符串 "12"

也就是说,只有在 + 号前后没有常量字符串(或者叫没出现引号)
你需要用这个 ++ 来告诉aardio,你要做的的是
字符串连接,而不是数值加运算。

// 行注释语句
这个是比较通用的语法, 不过在aardio里有一个特殊的用法:
行注释可以用于赋值语句中表示字符串,例如 var str = //这是一个字符串

这个与双引号类似,字符串都表示字面意义,没有转义符。

/* 段注释语句 */
这个也类似其他类 C 语言,但注意首尾的星号可以用多个、并且首尾星号的数目一定要匹配。
aardio使用这个特性来解决注释嵌套的麻烦问题。

另外,段注释也可以用在赋值语句中表示字符串,字符串都表示字面意义,没有转义符。
而换行总是被强制解释为 '\r\n',以避免不同文本编辑器导致的可能混淆的结果。
这个特性用来包含HTTP头之类严格指定回车换行的文本很方便。


aardio中可以调用一些其他语言的源代码,通常要包含大段的其他语言的源码,放到这个段注释里赋值给字符串变量就可以了。直接复制粘帖,不需要象其他语言里一样苦闷的折腾字符串转换。

"这个用来表示
普通字符串字面值"
双引号里表示普通字符串、不支持转义符。
而且双引号里面的文件是可以换行的,换行都被强制解释为 '\n'
也就是说在双引号里绝对不会、也没办法出现回车符,也就是 '\r'。

'这个用来表示转义字符串,
例如\r\n表示回车换行,
注意这后面的换行被忽略
注意这前面的换行被忽略'
单引号表示字符串时支持转义符,例如'\r\n'表示回车换行,
而且只能用 '\r\n'表示回车换行,文本本身的换行会被忽略,上面的示例中就只有一个回车换行

`反引号即键盘左上角ESC键下方的按键,字符串也可以放在反引号中,其作用与放在双引号中完全一样,通常含单引号的字符串我们用双引号,含双引号的字符串我们用单引号,那么同时包含单引号双引号的字符串呢?当然我们可以使用转义符、注释字符串,aardio10新增的反引号写法会更方便书写。`
上面使用是键盘左上角ESC键下方的按键输入反引号,
反引号在 aardio 中语法作用完全等价于双引号,唯一的区别就是可以用来包含双引号字面值。

** 乘方运算
例如 2 的3次方写为 2 ** 3

% 取模运算
例如24小时制的19点转换为12时制请问是几点, 就可以写为 19 % 12 结果是 7点

or ||  :  逻辑或运算符
这几个运算符语义都是完全相同的,唯一的区别是 : 的优先级略低

and && ?  逻辑与运算符
这几个运算符语义也是完全相同的,唯一的区别提 ? 的优先级略低

a ? b : c
这个是三元运算符,计算规则为:
a为真则计算b( b为真则返回b,否则仍然计算并返回c ),否则计算并返回c。
当a与b条件满足时不会计算c( c如果是一个函数调用就不会执行 ),a为假时不会计算b。

注意与C语言有所区别:
当b运算结果为假的时候仍然会返回c,aardio里这个三元运算符是尽最大可能去取回真值

() 括号
这个用在表达式中可以改变操作符的优先级, 例如 7 * ( 2 + 3 ) 括号里面的会先运算.
放在函数名后面则表示调用执行该函数,例如

import console //打开控制台
console.log("还可以写一个或多个参数")

定义函数的时候用来表示形参,例如

func =
function(a,b,c){
   console.log(
"收到参数",a,b,c )
}

... 不定参数
运行下面的示例你就明白了

func = function( a,... ){
   console.log(
"收到参数",... )
}

import console
func( 1 )
func( 1,2 )
func( 1,2,3,4 )

λ 希腊字母λ在aardio中可用于替代lambda关键字
lambda用于定义匿名函数,示例代码:

    import console;

    var arr = {1;2;3;4;7}
    var value = reduce(arr,λ(a,b) a + b );

    console.dump(value);
    console.pause(
true);

λ(a,b) a + b  
等价于
lambda(a,b) a + b  
也等价于
function(a,b) return a+b;

评分

参与人数 10 +73 收起 理由
longxing525 + 5 很给力!
lovellshn + 1 赞一个!
fjoox + 1 很给力!
Lambert_Cui + 1 赞一个!
redasurc + 5 看了三遍
瓜瓜爱电子 + 10 赞一个!
oney + 1 新手学习了
Mooke + 10 赞一个!
﹎灬随缘ゞ -1 那个三元运算不是判断a的真假,返回b或c吗.
air_fans + 40 很给力!

查看全部评分

0

主题

27

回帖

274

积分

二级会员

积分
274
发表于 2013-11-25 19:43:42 | 显示全部楼层
强贴留名,这下新手有福了,可以少走好多弯路

9

主题

79

回帖

499

积分

新手入门

积分
499
发表于 2013-11-26 08:39:11 | 显示全部楼层
用了这么久aardio看来也有收获啊

9

主题

193

回帖

1297

积分

四级会员

积分
1297
发表于 2013-11-27 13:49:34 | 显示全部楼层
谢谢整理,这个一定要收藏

2

主题

44

回帖

1217

积分

四级会员

积分
1217
QQ
发表于 2013-11-27 14:12:43 | 显示全部楼层
不错的教程,收藏

0

主题

72

回帖

475

积分

二级会员

积分
475
发表于 2013-11-27 19:28:08 | 显示全部楼层
好帖子

0

主题

32

回帖

190

积分

一级会员

积分
190
发表于 2013-11-28 14:49:34 | 显示全部楼层
好东西啊,有几个没掌握

12

主题

68

回帖

809

积分

培训班

积分
809
QQ
发表于 2013-11-28 20:38:18 | 显示全部楼层
谢谢版主打的好教程,以前有点别的基础,当时没看aardio的帮助文档,因为aardio确实上手很快,但看别人源码里的#字符就不理解了,后来才去读了遍文档。这下版主总结了这么多,谢谢了。

0

主题

35

回帖

512

积分

荣誉会员

积分
512
发表于 2013-12-5 09:21:10 | 显示全部楼层
多谢楼主分享

40

主题

519

回帖

3015

积分

新手入门

超级初学者

积分
3015
发表于 2013-12-5 16:00:08 | 显示全部楼层
好帖子,感谢楼主的经验

4

主题

16

回帖

141

积分

一级会员

积分
141
发表于 2013-12-14 10:32:19 | 显示全部楼层
学习了,谢谢。。。。。

0

主题

4

回帖

25

积分

新手入门

积分
25
发表于 2014-2-5 14:48:43 | 显示全部楼层
学习

0

主题

10

回帖

198

积分

一级会员

积分
198
QQ
发表于 2014-2-17 20:19:07 | 显示全部楼层

0

主题

1

回帖

8

积分

新手入门

积分
8
发表于 2014-2-22 13:25:07 | 显示全部楼层
支持版主,太强悍了

0

主题

12

回帖

77

积分

一级会员

积分
77
发表于 2014-3-11 09:16:53 | 显示全部楼层
这个真是好帖,严重支持喜爱

0

主题

1

回帖

15

积分

新手入门

积分
15
发表于 2014-3-20 00:36:15 | 显示全部楼层
谢谢分享。很给力

0

主题

32

回帖

190

积分

一级会员

积分
190
发表于 2014-4-6 21:39:24 | 显示全部楼层
难点啊,顿时开花了

1

主题

5

回帖

62

积分

一级会员

积分
62
发表于 2014-4-9 12:19:34 | 显示全部楼层
good~~~~~

0

主题

2

回帖

16

积分

新手入门

积分
16
发表于 2014-5-22 01:28:38 | 显示全部楼层
这个很有用
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-1-13 15:59 , Processed in 0.097717 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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