博客 / 詳情

返回

跟老衞學倉頡編程語言開發:標識符與程序結構

本節介紹倉頡編程語言的標識符和程序結構。

標識符

在倉頡編程語言中,開發者可以給一些程序元素命名,這些名字也被稱為“標識符”,標識符分為普通標識符和原始標識符兩類,它們分別遵從不同的命名規則。

普通標識符不能和倉頡關鍵字相同,可以取自以下兩類字符序列:

由“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(倉頡版)(視頻)
  • 倉頡編程從入門到實踐(北京大學出版社)

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.