手记

跟老卫学仓颉编程语言开发:标识符与程序结构

2025-12-23 08:42:4584浏览

老卫

2实战 · 257手记 · 2推荐

本节介绍仓颉编程语言的标识符和程序结构。

标识符

在仓颉编程语言中,开发者可以给一些程序元素命名,这些名字也被称为“标识符”,标识符分为普通标识符和原始标识符两类,它们分别遵从不同的命名规则。

普通标识符不能和仓颉关键字相同,可以取自以下两类字符序列:

由“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”应用下找到。

参考引用

0人推荐
随时随地看视频
慕课网APP