本節介紹倉頡編程語言的標識符和程序結構。
標識符
在倉頡編程語言中,開發者可以給一些程序元素命名,這些名字也被稱為“標識符”,標識符分為普通標識符和原始標識符兩類,它們分別遵從不同的命名規則。
普通標識符不能和倉頡關鍵字相同,可以取自以下兩類字符序列:
由“XID_Start”字符開頭,後接任意長度的“XID_Continue”字符
由一個“_”開頭,後接至少一個“XID_Continue”字符
其中,“XID_Start”、“XID_Continue”定義見Unicode標準。倉頡使用Unicode標準15.0.0(https://www.unicode.org/reports/tr31/tr31-37.html)。
倉頡把所有標識符識別為Normalization Form C (NFC) 後的形式。兩個標識符如果在NFC後相等,則認為是相同的標識符。
例如,以下每行字符串都是合法的普通標識符:
abc
_abc
abc_
a1b2c3
a_b_c
a1_b2_c3
倉頡
__こんにちは
以下每行字符串都是不合法的普通標識符:
ab&c // 使用了非法字符 “&”
3abc // 數字不能出現在頭部
while // 不能使用倉頡關鍵字
原始標識符是在普通標識符或倉頡關鍵字的外面加上一對反引號,主要用於將倉頡關鍵字作為標識符的場景。
例如,以下每行字符串都是合法的原始標識符:
`abc`
`_abc`
`a1b2c3`
`if`
`while`
`à֮̅̕b`
以下每行字符串,由於反引號內的部分是不合法的普通標識符,所以它們整體也是不合法的原始標識符:
`ab&c`
`3abc`
程序結構
通常,我們都會在擴展名為.cj的文本文件中編寫倉頡程序,這些程序和文件也被稱為源代碼和源文件,在程序開發的最後階段,這些源代碼將被編譯為特定格式的二進制文件。
在倉頡程序的頂層作用域中,可以定義一系列的變量、函數和自定義類型(如struct、class、enum和interface等),其中的變量和函數分別被稱為全局變量和全局函數。如果要將倉頡程序編譯為可執行文件,則需要在頂層作用域中定義一個main函數作為程序入口,它可以有Array<String>類型的參數,也可以沒有參數,它的返回值類型可以是整數類型或Unit類型。
注:定義main函數時,不需要寫func修飾符。此外,如果需要獲取程序啓動時的命令行參數,可以聲明和使用Array<String>類型參數。
例如在以下程序中,我們在頂層作用域定義了全局變量g和全局函數b,還有自定義類型C、D和E,以及作為程序入口的main函數。
let g = 2022
func b() {}
struct C {}
class D {}
enum E { F | G }
main() {
println(g)
}
在非頂層作用域中不能定義上述自定義類型,但可以定義變量和函數,稱之為局部變量和局部函數。特別地,對於定義在自定義類型中的變量和函數,稱之為成員變量和成員函數。
注:enum和interface中僅支持定義成員函數,不支持定義成員變量。
例如在以下程序中,我們在頂層作用域定義了全局函數a和自定義類型A,在函數a中定義了局部變量b和局部函數c,在自定義類型A中定義了成員變量b和成員函數c。
func a() {
let b = 2023
func c() {
println(b)
}
c()
}
class A {
let b = 2024
public func c() {
println(b)
}
}
main() {
a()
A().c()
}
運行以上程序,將輸出:
2023
2024
本節示例可以在“program_structure_demo”應用下找到。
參考引用
- 免費開源書《跟老衞學倉頡編程語言開發》
- 免費開源書《跟老衞學HarmonyOS開發》
- HarmonyOS NEXT+AI大模型打造智能助手APP(倉頡版)(視頻)
- 倉頡編程從入門到實踐(北京大學出版社)