aardio教程一) 基礎語法-上

来源:https://www.cnblogs.com/kanadeblisst/p/18075162
-Advertisement-
Play Games

前言 想開發一些小工具,所以想系統性的學習一遍aardio,之前都是哪裡不會搜哪裡,順便寫些教程。我的主要語言是Python,所以會以Python作為對比來加深印象。 aardio的基礎語法和JavaScript基本類似,如果你學過JavaScript,aardio很容易上手。下麵的文檔來自官方文檔 ...


前言

想開發一些小工具,所以想系統性的學習一遍aardio,之前都是哪裡不會搜哪裡,順便寫些教程。我的主要語言是Python,所以會以Python作為對比來加深印象。

aardio的基礎語法和JavaScript基本類似,如果你學過JavaScript,aardio很容易上手。下麵的文檔來自官方文檔 [1]

問題搜索途徑

基礎語法看:https://bbs.aardio.com/doc/reference/

一些庫的使用,獲取文檔有以下途徑:

  1. aardio官方論壇(https://bbs.aardio.com),我一般用谷歌搜索 site:bbs.aardio.com 搜索內容
  2. aardio官方公眾號
  3. 打開編輯器開始頁的話有開髮指南和文檔資源,右側有官方資訊,剛入門都可以看一下。裡面的庫函數文檔我經常用
  4. 寫一個函數的時候右鍵轉到定義,庫代碼下麵一般都有註釋怎麼用
  5. 用vscode打開整個aardio軟體目錄,搜索你不知道怎麼用的庫,看看官方是怎麼使用的,這個我用的最多
  6. aardio相關的第三方論壇:https://aardio.online/thread-20.htm

語法

標識符

變數標識符的定義和Python基本一樣,語法如下:

  • 字母(區分大小寫)、數字和下劃線,也可以用中文
  • 數字不能作為變數首個字元

與Python不同的點:

  • 除了單個下劃線_,其他下劃線開頭的為常量,定義後無法被修改
  • 可以以$符開頭
  • 包含中文時,前面不能有字元和數字

關鍵字

- -
var 用於定義局部變數 def 用於定義關鍵字
and not or 邏輯運算符 begin end 用於包含語句塊
if else elseif 用於條件判斷語句 for in 用於迴圈語句
select case 用於條件判斷語句 try catch 用於捕獲異常
break continue 迴圈中斷語句 function 用於創建函數
namespace 用於創建或打開名字空間 import 用於引用庫
this 用於在類內部表示當前實例對象 global 用於表示全局名字空間
owner 用於表示調用函數的主體對象 while do 用於迴圈語句
null 用於表示空值 false true 用於表示布爾值
class ctor 用於創建類 return 用於函數中返回值
with 用於打開名字空間 self 用於表示當前名字空間

你如果閑的無聊的話,也可以使用def自定義關鍵詞,比如:

def 如果 = if
def 否則 = else
def 否則是 = elseif
def 名字空間= namespace
def 迴圈 = while

io.open();

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

改個名字和圖標,一款新的中文編程語言就寫好了

分隔符和註釋符

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

var a, b = 1, 2;

# 後面的分號可寫可不寫,我一般都寫上
var a = 1
var b = 2

註釋則是使用///**/,也可以使用多個/******/,只需要前面和後面的數量對應上

操作符

算術運算符 + - * / ** %
按位運算符 ~ 取反 & ` ` 或 ^ 異或 << 左移
等式運算符 == !=
邏輯運算符 ! not ` or :` && and ?
關係運算符 > < >= <=
連接運算符 ++
取長運算符 #
全局變數定義 ::
成員操作符 . [] [[]]
包含操作符 $
  • 字元串之間使用關係運算符時,是從第一個字元開始比較,這個和Python也是一樣的
  • ++並不是c語言裡面的自增,而是用於字元串和字元串拼接,或者字元串和數值拼接。例如: 1 ++ "2" == "12",也可以省略成1+"2"
  • 取長運算符用於獲取字元串和數組長度,如果是對象則調用_len元方法
  • 在變數名前面加::表示為全局常量,比如::Kernel32 := raw.loadDll("Kernel32.dll");,可以避免重覆載入dll
  • 成員操作符.和[]基本可以混用,除非成員名稱不符合aardio命令規定則使用[]
  • [[]]一般是在元方法中使用,它不會調用元方法,可以避免無限遞歸
  • 路徑字元串前加$符表示內嵌該文件到編譯後的exe中

邏輯運算符

||or:再使用上基本沒有區別,大部分情況下可以互相替換。

  • 邏輯與和邏輯或運算符就能組成類似三元運算符的效果 true ? 1 : 0
  • a := 1等同於a = a : 1,可以用於避免重覆賦值
  • a ?= f(a)等同於a = a ? f(a),可以只當a不為null執行f(a)
  • 也有像Python一樣的用邏輯運算符做條件取值的操作,比如a = 1 or 2b = 0 or 3。語法和意思也和Python是一樣的

按位無符號右移

a >>> n 將數值a按位向右移動n位(如果n大於等於32,則為n對32取模結果的位數) ,不保留符號位(負數不保持最高位為1,因此右移後會變成正數)

實際用途:

可以通過右移 0 位將有符號數強制轉換為無符號數。例如 -1 >>> 0 的值為 0xFFFFFFFF , 其作用等價於 raw.convert( {int value = -1},{INT value}).value。

不聲明調用靜態 API 預設會返回 32位有符號整數,如果原 API 返回的是 32位無符號整數,那麼只要簡單的將返回值 >>> 0 就可以得到原來的無符號數值了

這裡有一點很重要: 記憶體里的數據都是0和1,它是什麼值只取決於你以什麼類型讀取它

等式運算符

基礎數據類型會判斷值是否相等,而非基本類型則是判斷對象是否相等或者調用_eq元方法判斷

元方法類似Python的魔法方法,可以重載對象的符號運算,比如_eq重載==

0, nullfalse 相等,其他類型都與true想等

跟數值類型比較時:

  • 字元串會自動轉為數值類型再做比較,空字元串""轉為0,空白字元\r\n\t也是轉為0
  • 如果是對象,則是調用_tonumber元方法轉數值
表達式 結果
"123"==123 true
"abc"==123 false
""==0 true
'\r\n\t '==0 true
null==0 false

還有一個恆等判斷的符號===!==,它不會調用_eq元方法,直接判斷類型和數值都相等

運算符優先順序

這個東西沒必要記,有疑問時加括弧即可。遇到別人的代碼有疑問,可以運行測試下

基礎數據類型

類型 舉例值 說明
type.null null
type.boolean 布爾值
type.number 數值 預設為64位浮點數
type.string 字元串 字元串和Python也基本一樣,utf-8編碼
type.buffer raw.buffer 可用於接收c語言char*數據
type.pointer 指針 接收dll返回的指針數據,或者使用topointer(obj)
type.table aardio中的數組、字典等複雜類型
type.function 函數 function創建的函數
type.cdata 內核對象 一般不用關心
type.fiber 纖程 沒用過
type.class class關鍵詞創建的類

null

任何沒有定義或賦值的變數預設都是null。如果函數不傳參數,預設傳過去的也是null。

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

數值類型

  • 2#11表示二進位數,8#11表示八進位數,16#A表示十六進位數,也可以表示為0xA
  • 2e+20(2x10**20)表示科學計數法, +僅表示指數的正負,可加可不加
  • 可以用_來分隔數值,111_222等同於111222

字元串

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

string.fromUnicode(s)string.toUnicode(s)可以做utf-8 <=> utf-16的轉換,Windows上使用的Unicode編碼一般就是指的utf-16,兩個函數都可以指定第二個參數,代表目標編碼的代碼頁,用於轉換其他編碼。

常用的代碼頁: 936(gb2312)、1200(utf-16 le)、1201(utf-16 be)、65001(utf-8)。所有代碼頁可以參考: 標準代碼頁(codepage)列表 [2]

Windows可以在cmd下使用chcp命令查看當前使用的代碼頁,一般情況下都是936。

定義字元串的話有四種方式: 雙引號("")、單引號('')、反引號(``)和註釋符(/**/)。其中雙引號和反引號用法是一樣的

都可以定義多行字元串:

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

不同點:

  • 只有單引號可以使用轉義字元,例如'\n'表示換行。
  • 單引號的換行會被忽略,所以單引號表示換行時和c語言一樣使用轉義字元\n
  • 雙引號的換行會被替換成\n
  • 註釋符的換行會被替換成\r\n
  • 在雙引號中可以使用兩個雙引號表示雙引號本身,例如"1222""11111",則等同於'1222"11111'
  • 在單引號中\'表示單引號本身, 例如'1222\'11111',則等同於"1222'11111"
  • 'A'#表示這個字元的ASCII值,也就是65
  • 'UTF16字元串'u表示UTF-16 LE編碼的字元串
  • 文件路徑引號前加$符表示編譯後將文件嵌入到exe中,載入dll時經常會用到

全局函數

Python中有strintprint 這些可以使用的全局函數,aardio中也內置了一些可以全局使用的函數。我覺得用不到的就不在下麵列出來了

tostring

  • 將某個值轉換為字元串,如果是對象則調用_tostring元方法。
  • 第二個參數可以指定進位,比如tostring(10, 16)返回0xA
  • 如果第一個參數是時間,則第二個參數可以指定格式化時間的字元串,比如tostring(time(), "%Y-%m-%d %H:%M:%S")

topointer

將參數轉換為指針,這個函數我還沒用過。到時候用的時候再看什麼作用

tonumber

  • 將某個值轉換為數值,如果是對象則調用_tonumber元方法。
  • 如果是指針則返回記憶體地址
  • 如果是字元串, 第二個參數可以指定進位,例如tonumber("0xA", 16)

註意: 這個函數會返回兩個值,第一個是轉換後的數值。第二個是轉換使用的字元數。例如tonumber("12a"), 返回12和2.

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

invoke

invoke(被調用函數, owner, 參數1, 參數2)

調用指定函數,owner這個後面再提

call

call(被調用函數, owner, 參數)

調用指定函數,跟invoke基本類似

callex

callex(異常處理函數,被調用函數, owner, 參數)

當被調用函數代碼出現異常時則調用異常處理函數

loadcode

載入編譯代碼,參數可以是代碼字元串或者代碼路徑

loadcodex

載入編譯和運行代碼,參數可以是代碼字元串或者代碼路徑

dumpcode

編譯代碼為二進位位元組

sleep

同步阻塞休眠,和Python的time.sleep一樣,單線程情況下會卡住界面。界面中應使用win.delay

type

用於獲取對象的數據類型,一般使用type(obj) == type.string來判斷對象是不是字元串,所有類型請看基礎語法中的基本數據類型

eval

運行aardio代碼,並返回表達式的值

error

主動拋出異常

參考

  • [1] aardio官方文檔: https://bbs.aardio.com/doc/reference/
  • [2] 標準代碼頁(codepage)列表: https://blog.csdn.net/jianggujin/article/details/80325461
  • Python所有全局函數: https://mp.weixin.qq.com/s/PA0lsojc-zkZ4eltj8P6Kg

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • OI 一場空,不開 long long 見祖宗 cmp,一定要在 sort 里寫入 打 st 表一定要算空間複雜度 打倍增 LCA 一定要算空間複雜度 註意 ÷0 線段樹 4 倍空間 無向圖,鏈式前向星 2 倍空間 樹鏈剖分要註意是原編號還是 dfn 序的編號 鏈式前向星遍歷圖的時間複雜度永遠為 + ...
  • 一、數據類型 定義: 就是用了保存數據的一個類型,一種數據類型,只能保存該類型數據值 作用: 只有瞭解數據類型,才能選擇合適的類型存放數據,才能更好的利用電腦硬體資源(記憶體和硬碟等)。 不同的數據類型存放數據大小是不同的。 數據類型的使用方式就是用來聲明一個變數,裝數據的。 常用的整數類型是 in ...
  • 在開發過程中,碰到需要在 Python Django 項目中連接到位於 ECS 上但未開通外網地址的 RDS 資料庫。 這種情況下,通過建立 SSH 隧道來實現連接,確保數據傳輸的安全性和可靠性。 1、安裝 sshtunnel 包 pip3 install sshtunnel 2、導入 SSHTun ...
  • 在MyBatis中,如果你使用resultType而不是resultMap,並且結果集中有同名欄位,則預設情況下後出現的欄位值會覆蓋前面的欄位值。這是因為MyBatis在將結果集映射到Java對象時,是按照欄位名稱一一對應進行賦值的。 但若你希望更精確地控制映射關係,並且避免自動覆蓋行為,則可以用r ...
  • 當開發者意識到代碼庫開始變得般混亂不堪時,就會在現有項目中引入狀態機。狀態機的引入有助於將複雜多變的應用程式狀態轉換過程組織得更為有序和清晰,從而避免代碼陷入難以維護的境地。 ...
  • 優秀可靠的數倉體系,需要良好的數據分層結構。合理的分層,能夠使數據體系更加清晰,使複雜問題得以簡化。以下是該項目的分層規劃。 1 設計要點 (1)ODS層的表結構設計依托於從業務系統同步過來的數據結構 (2)ODS層要保存全部歷史數據,故其壓縮格式應選擇壓縮比較高的,此處選擇gzip (3)ODS層 ...
  • 全面介紹雲計算安全的意義、安全模型、雲安全挑戰、雲安全最佳實踐和技術解決方案,最終深入研究雲安全案例,讓大家對雲安全有全面的理解。 關註【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能 ...
  • 我們在使用pandas處理完數據之後,最終總是要把數據作為一個文件保存下來,那麼,保存數據最常用的文件是什麼呢?我想大部分人一定會選擇csv或者excel。 剛接觸數據分析時,我也是這麼選擇的,不過,今天將介紹幾種不一樣的存儲數據的文件格式。這些文件格式各有自己的一些優點,希望本文能讓你以後的數據存 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...