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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...