aardio教程一) 基礎(chǔ)語(yǔ)法-上

前言

想開(kāi)發(fā)一些小工具,所以想系統(tǒng)性的學(xué)習(xí)一遍aardio奋献,之前都是哪里不會(huì)搜哪里,順便寫(xiě)些教程旺上。我的主要語(yǔ)言是Python瓶蚂,所以會(huì)以Python作為對(duì)比來(lái)加深印象。

aardio的基礎(chǔ)語(yǔ)法和JavaScript基本類(lèi)似宣吱,如果你學(xué)過(guò)JavaScript窃这,aardio很容易上手。下面的文檔來(lái)自官方文檔 [1]

問(wèn)題搜索途徑

基礎(chǔ)語(yǔ)法看:https://bbs.aardio.com/doc/reference/

一些庫(kù)的使用征候,獲取文檔有以下途徑:

  1. aardio官方論壇(https://bbs.aardio.com)杭攻,我一般用谷歌搜索 site:bbs.aardio.com 搜索內(nèi)容
  2. aardio官方公眾號(hào)
  3. 打開(kāi)編輯器開(kāi)始頁(yè)的話(huà)有開(kāi)發(fā)指南和文檔資源,右側(cè)有官方資訊疤坝,剛?cè)腴T(mén)都可以看一下朴上。里面的庫(kù)函數(shù)文檔我經(jīng)常用
  4. 寫(xiě)一個(gè)函數(shù)的時(shí)候右鍵轉(zhuǎn)到定義,庫(kù)代碼下面一般都有注釋怎么用
  5. 用vscode打開(kāi)整個(gè)aardio軟件目錄卒煞,搜索你不知道怎么用的庫(kù)痪宰,看看官方是怎么使用的,這個(gè)我用的最多
  6. aardio相關(guān)的第三方論壇:https://aardio.online/thread-20.htm

語(yǔ)法

標(biāo)識(shí)符

變量標(biāo)識(shí)符的定義和Python基本一樣畔裕,語(yǔ)法如下:

  • 字母(區(qū)分大小寫(xiě))衣撬、數(shù)字和下劃線(xiàn),也可以用中文
  • 數(shù)字不能作為變量首個(gè)字符

與Python不同的點(diǎn):

  • 除了單個(gè)下劃線(xiàn)_扮饶,其他下劃線(xiàn)開(kāi)頭的為常量具练,定義后無(wú)法被修改
  • 可以以$符開(kāi)頭
  • 包含中文時(shí),前面不能有字符和數(shù)字

關(guān)鍵字

- -
var 用于定義局部變量 def 用于定義關(guān)鍵字
and not or 邏輯運(yùn)算符 begin end 用于包含語(yǔ)句塊
if else elseif 用于條件判斷語(yǔ)句 for in 用于循環(huán)語(yǔ)句
select case 用于條件判斷語(yǔ)句 try catch 用于捕獲異常
break continue 循環(huán)中斷語(yǔ)句 function 用于創(chuàng)建函數(shù)
namespace 用于創(chuàng)建或打開(kāi)名字空間 import 用于引用庫(kù)
this 用于在類(lèi)內(nèi)部表示當(dāng)前實(shí)例對(duì)象 global 用于表示全局名字空間
owner 用于表示調(diào)用函數(shù)的主體對(duì)象 while do 用于循環(huán)語(yǔ)句
null 用于表示空值 false true 用于表示布爾值
class ctor 用于創(chuàng)建類(lèi) return 用于函數(shù)中返回值
with 用于打開(kāi)名字空間 self 用于表示當(dāng)前名字空間

你如果閑的無(wú)聊的話(huà)甜无,也可以使用def自定義關(guān)鍵詞扛点,比如:

def 如果 = if
def 否則 = else
def 否則是 = elseif
def 名字空間= namespace
def 循環(huán) = while

io.open();

如果 1== 1 {
    io.print(" 1等于1 ")
}
否則{
    io.print(" 1不等于1 ")
}

改個(gè)名字和圖標(biāo)哥遮,一款新的中文編程語(yǔ)言就寫(xiě)好了

分隔符和注釋符

分隔每條語(yǔ)句可以用換行或者分號(hào), 一下三種方法都可以:
var a = 1; var b = 2;

var a, b = 1, 2;

# 后面的分號(hào)可寫(xiě)可不寫(xiě),我一般都寫(xiě)上
var a = 1
var b = 2

注釋則是使用///**/陵究,也可以使用多個(gè)/******/眠饮,只需要前面和后面的數(shù)量對(duì)應(yīng)上

操作符

算術(shù)運(yùn)算符 + - * / ** %
按位運(yùn)算符 ~ 取反 & ` ` 或 ^ 異或 << 左移 >> 右移
等式運(yùn)算符 == !=
邏輯運(yùn)算符 ! not ` or:` && and ?
關(guān)系運(yùn)算符 > < >= <=
連接運(yùn)算符 ++
取長(zhǎng)運(yùn)算符 #
全局變量定義 ::
成員操作符 . [] [[]]
包含操作符 $
  • 字符串之間使用關(guān)系運(yùn)算符時(shí),是從第一個(gè)字符開(kāi)始比較铜邮,這個(gè)和Python也是一樣的
  • ++并不是c語(yǔ)言里面的自增仪召,而是用于字符串和字符串拼接,或者字符串和數(shù)值拼接松蒜。例如: 1 ++ "2" == "12",也可以省略成1+"2"
  • 取長(zhǎng)運(yùn)算符用于獲取字符串和數(shù)組長(zhǎng)度扔茅,如果是對(duì)象則調(diào)用_len元方法
  • 在變量名前面加::表示為全局常量,比如::Kernel32 := raw.loadDll("Kernel32.dll");秸苗,可以避免重復(fù)加載dll
  • 成員操作符.和[]基本可以混用召娜,除非成員名稱(chēng)不符合aardio命令規(guī)定則使用[]
  • [[]]一般是在元方法中使用,它不會(huì)調(diào)用元方法惊楼,可以避免無(wú)限遞歸
  • 路徑字符串前加$符表示內(nèi)嵌該文件到編譯后的exe中

邏輯運(yùn)算符

||玖瘸、or:再使用上基本沒(méi)有區(qū)別,大部分情況下可以互相替換胁后。

  • 邏輯與和邏輯或運(yùn)算符就能組成類(lèi)似三元運(yùn)算符的效果 true ? 1 : 0
  • a := 1等同于a = a : 1,可以用于避免重復(fù)賦值
  • a ?= f(a)等同于a = a ? f(a)嗦枢,可以只當(dāng)a不為null執(zhí)行f(a)
  • 也有像Python一樣的用邏輯運(yùn)算符做條件取值的操作攀芯,比如a = 1 or 2b = 0 or 3文虏。語(yǔ)法和意思也和Python是一樣的

按位無(wú)符號(hào)右移

a >>> n 將數(shù)值a按位向右移動(dòng)n位(如果n大于等于32侣诺,則為n對(duì)32取模結(jié)果的位數(shù)) ,不保留符號(hào)位(負(fù)數(shù)不保持最高位為1氧秘,因此右移后會(huì)變成正數(shù))

實(shí)際用途:

可以通過(guò)右移 0 位將有符號(hào)數(shù)強(qiáng)制轉(zhuǎn)換為無(wú)符號(hào)數(shù)年鸳。例如 -1 >>> 0 的值為 0xFFFFFFFF , 其作用等價(jià)于 raw.convert( {int value = -1},{INT value}).value。

不聲明調(diào)用靜態(tài) API 默認(rèn)會(huì)返回 32位有符號(hào)整數(shù)丸相,如果原 API 返回的是 32位無(wú)符號(hào)整數(shù)搔确,那么只要簡(jiǎn)單的將返回值 >>> 0 就可以得到原來(lái)的無(wú)符號(hào)數(shù)值了

這里有一點(diǎn)很重要: 內(nèi)存里的數(shù)據(jù)都是0和1,它是什么值只取決于你以什么類(lèi)型讀取它灭忠。

等式運(yùn)算符

基礎(chǔ)數(shù)據(jù)類(lèi)型會(huì)判斷值是否相等膳算,而非基本類(lèi)型則是判斷對(duì)象是否相等或者調(diào)用_eq元方法判斷

元方法類(lèi)似Python的魔法方法,可以重載對(duì)象的符號(hào)運(yùn)算弛作,比如_eq重載==涕蜂。

0, nullfalse 相等,其他類(lèi)型都與true想等

跟數(shù)值類(lèi)型比較時(shí):

  • 字符串會(huì)自動(dòng)轉(zhuǎn)為數(shù)值類(lèi)型再做比較映琳,空字符串""轉(zhuǎn)為0机隙,空白字符\r\n\t也是轉(zhuǎn)為0
  • 如果是對(duì)象蜘拉,則是調(diào)用_tonumber元方法轉(zhuǎn)數(shù)值
表達(dá)式 結(jié)果
"123"==123 true
"abc"==123 false
""==0 true
'\r\n\t '==0 true
null==0 false

還有一個(gè)恒等判斷的符號(hào)===!==,它不會(huì)調(diào)用_eq元方法有鹿,直接判斷類(lèi)型和數(shù)值都相等

運(yùn)算符優(yōu)先級(jí)

這個(gè)東西沒(méi)必要記旭旭,有疑問(wèn)時(shí)加括號(hào)即可。遇到別人的代碼有疑問(wèn)印颤,可以運(yùn)行測(cè)試下

基礎(chǔ)數(shù)據(jù)類(lèi)型

類(lèi)型 舉例值 說(shuō)明
type.null null
type.boolean 布爾值
type.number 數(shù)值 默認(rèn)為64位浮點(diǎn)數(shù)
type.string 字符串 字符串和Python也基本一樣您机,utf-8編碼
type.buffer raw.buffer 可用于接收c語(yǔ)言char*數(shù)據(jù)
type.pointer 指針 接收dll返回的指針數(shù)據(jù),或者使用topointer(obj)
type.table aardio中的數(shù)組年局、字典等復(fù)雜類(lèi)型
type.function 函數(shù) function創(chuàng)建的函數(shù)
type.cdata 內(nèi)核對(duì)象 一般不用關(guān)心
type.fiber 纖程 沒(méi)用過(guò)
type.class 類(lèi) class關(guān)鍵詞創(chuàng)建的類(lèi)

null

任何沒(méi)有定義或賦值的變量默認(rèn)都是null际看。如果函數(shù)不傳參數(shù),默認(rèn)傳過(guò)去的也是null矢否。

import console; 
console.dump(a);
console.pause(true);
import console; 
function f(a){
    console.dump(a);
}
f()
console.pause(true);

數(shù)值類(lèi)型

  • 2#11表示二進(jìn)制數(shù)仲闽,8#11表示八進(jìn)制數(shù),16#A表示十六進(jìn)制數(shù)僵朗,也可以表示為0xA赖欣。
  • 2e+20(2x10**20)表示科學(xué)計(jì)數(shù)法, +僅表示指數(shù)的正負(fù),可加可不加
  • 可以用_來(lái)分隔數(shù)值验庙,111_222等同于111222

字符串

aardio中定義的字符串都是utf-8編碼

string.fromUnicode(s)顶吮、string.toUnicode(s)可以做utf-8 <=> utf-16的轉(zhuǎn)換,Windows上使用的Unicode編碼一般就是指的utf-16粪薛,兩個(gè)函數(shù)都可以指定第二個(gè)參數(shù)悴了,代表目標(biāo)編碼的代碼頁(yè),用于轉(zhuǎn)換其他編碼违寿。

常用的代碼頁(yè): 936(gb2312)湃交、1200(utf-16 le)、1201(utf-16 be)藤巢、65001(utf-8)搞莺。所有代碼頁(yè)可以參考: 標(biāo)準(zhǔn)代碼頁(yè)(codepage)列表 [2]

Windows可以在cmd下使用chcp命令查看當(dāng)前使用的代碼頁(yè),一般情況下都是936掂咒。

定義字符串的話(huà)有四種方式: 雙引號(hào)("")才沧、單引號(hào)('')、反引號(hào)(``)和注釋符(/**/)绍刮。其中雙引號(hào)和反引號(hào)用法是一樣的

都可以定義多行字符串:

a = "1
2";
b = '1
2';
c = /*1
2*/

不同點(diǎn):

  • 只有單引號(hào)可以使用轉(zhuǎn)義字符糜工,例如'\n'表示換行。
  • 單引號(hào)的換行會(huì)被忽略录淡,所以單引號(hào)表示換行時(shí)和c語(yǔ)言一樣使用轉(zhuǎn)義字符\n
  • 雙引號(hào)的換行會(huì)被替換成\n
  • 注釋符的換行會(huì)被替換成\r\n
  • 在雙引號(hào)中可以使用兩個(gè)雙引號(hào)表示雙引號(hào)本身捌木,例如"1222""11111",則等同于'1222"11111'
  • 在單引號(hào)中\'表示單引號(hào)本身, 例如'1222\'11111'嫉戚,則等同于"1222'11111"
  • 'A'#表示這個(gè)字符的ASCII值刨裆,也就是65
  • 'UTF16字符串'u表示UTF-16 LE編碼的字符串
  • 文件路徑引號(hào)前加$符表示編譯后將文件嵌入到exe中澈圈,加載dll時(shí)經(jīng)常會(huì)用到

全局函數(shù)

Python中有strint帆啃、print 這些可以使用的全局函數(shù)瞬女,aardio中也內(nèi)置了一些可以全局使用的函數(shù)。我覺(jué)得用不到的就不在下面列出來(lái)了

tostring

  • 將某個(gè)值轉(zhuǎn)換為字符串努潘,如果是對(duì)象則調(diào)用_tostring元方法诽偷。
  • 第二個(gè)參數(shù)可以指定進(jìn)制,比如tostring(10, 16)返回0xA
  • 如果第一個(gè)參數(shù)是時(shí)間疯坤,則第二個(gè)參數(shù)可以指定格式化時(shí)間的字符串报慕,比如tostring(time(), "%Y-%m-%d %H:%M:%S")

topointer

將參數(shù)轉(zhuǎn)換為指針,這個(gè)函數(shù)我還沒(méi)用過(guò)压怠。到時(shí)候用的時(shí)候再看什么作用

tonumber

  • 將某個(gè)值轉(zhuǎn)換為數(shù)值眠冈,如果是對(duì)象則調(diào)用_tonumber元方法。
  • 如果是指針則返回內(nèi)存地址
  • 如果是字符串, 第二個(gè)參數(shù)可以指定進(jìn)制菌瘫,例如tonumber("0xA", 16)

注意: 這個(gè)函數(shù)會(huì)返回兩個(gè)值蜗顽,第一個(gè)是轉(zhuǎn)換后的數(shù)值。第二個(gè)是轉(zhuǎn)換使用的字符數(shù)雨让。例如tonumber("12a"), 返回12和2.

一般會(huì)使用兩個(gè)值接收var a, b = tonumber("12a")

invoke

invoke(被調(diào)用函數(shù), owner, 參數(shù)1, 參數(shù)2)

調(diào)用指定函數(shù)雇盖,owner這個(gè)后面再提

call

call(被調(diào)用函數(shù), owner, 參數(shù))

調(diào)用指定函數(shù),跟invoke基本類(lèi)似

callex

callex(異常處理函數(shù),被調(diào)用函數(shù), owner, 參數(shù))

當(dāng)被調(diào)用函數(shù)代碼出現(xiàn)異常時(shí)則調(diào)用異常處理函數(shù)

loadcode

加載編譯代碼栖忠,參數(shù)可以是代碼字符串或者代碼路徑

loadcodex

加載編譯和運(yùn)行代碼崔挖,參數(shù)可以是代碼字符串或者代碼路徑

dumpcode

編譯代碼為二進(jìn)制字節(jié)

sleep

同步阻塞休眠,和Python的time.sleep一樣娃闲,單線(xiàn)程情況下會(huì)卡住界面虚汛。界面中應(yīng)使用win.delay

type

用于獲取對(duì)象的數(shù)據(jù)類(lèi)型匾浪,一般使用type(obj) == type.string來(lái)判斷對(duì)象是不是字符串皇帮,所有類(lèi)型請(qǐng)看基礎(chǔ)語(yǔ)法中的基本數(shù)據(jù)類(lèi)型

eval

運(yùn)行aardio代碼,并返回表達(dá)式的值

error

主動(dòng)拋出異常

參考

  • [1] aardio官方文檔: https://bbs.aardio.com/doc/reference/
  • [2] 標(biāo)準(zhǔn)代碼頁(yè)(codepage)列表: https://blog.csdn.net/jianggujin/article/details/80325461
  • Python所有全局函數(shù): https://mp.weixin.qq.com/s/PA0lsojc-zkZ4eltj8P6Kg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛋辈,一起剝皮案震驚了整個(gè)濱河市属拾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冷溶,老刑警劉巖渐白,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逞频,居然都是意外死亡纯衍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)苗胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)襟诸,“玉大人瓦堵,你說(shuō)我怎么就攤上這事「枨祝” “怎么了菇用?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)陷揪。 經(jīng)常有香客問(wèn)我惋鸥,道長(zhǎng),這世上最難降的妖魔是什么悍缠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任卦绣,我火速辦了婚禮,結(jié)果婚禮上扮休,老公的妹妹穿的比我還像新娘迎卤。我一直安慰自己,他們只是感情好玷坠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布蜗搔。 她就那樣靜靜地躺著,像睡著了一般八堡。 火紅的嫁衣襯著肌膚如雪樟凄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天兄渺,我揣著相機(jī)與錄音缝龄,去河邊找鬼。 笑死挂谍,一個(gè)胖子當(dāng)著我的面吹牛叔壤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播口叙,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼炼绘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了妄田?” 一聲冷哼從身側(cè)響起俺亮,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疟呐,沒(méi)想到半個(gè)月后脚曾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡启具,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年本讥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拷沸,死狀恐怖旨椒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堵漱,我是刑警寧澤综慎,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站勤庐,受9級(jí)特大地震影響示惊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愉镰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一米罚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丈探,春花似錦录择、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至讼渊,卻和暖如春动看,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爪幻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工菱皆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挨稿。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓仇轻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親奶甘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篷店,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容