# 声明常量

## 功能

常量用于保存定义后不允许再次写入的绑定，适合配置项、固定标识、数学常数和不会变化的函数或类引用。

## 语法

```bt
Name = 'Lisa'
Name_1 = 'Lisa'
NAME = 'BT'
```

## 命名规则

| 规则 | 说明 |
| ------ | ------ |
| 首字母 | 必须是大写英文字母。 |
| 后续字符 | 可以是英文字母、数字或 `_`。 |
| 大小写 | 区分大小写，`Name` 和 `NAME` 是两个不同常量。 |

`Name`、`Config`、`NAME`、`Name_1` 都是常量名；`User$` 不是合法常量名，因为常量名不能包含 `$`。

## 返回值

| 类型 | 说明 |
| ------ | ------ |
| Any | 常量定义表达式返回右侧表达式的值。 |

## 代码示例

```bt
Name = 'Lisa'

fn first() {
    Token = 'A'
    Token
}

fn second() {
    Token = 'B'
    Token
}

println Name
println first()
println second()
```

## 注意事项

- 常量不能重复定义；同一作用域内第二次写入会报错。
- 常量不使用 `let`；`let` 只用于普通变量，`let Name = 1` 会按变量命名规则报错。
- 全局常量在当前 VM 中长期存在，函数内不能定义同名常量，也不能定义与已有全局变量同名的常量。
- 函数内第一次定义的常量属于函数局部作用域，函数调用结束后销毁；不同函数内可以定义同名局部常量。
- 常量名只保护绑定本身；如果常量保存的是对象或数组，是否修改其内部字段取决于对象或数组方法本身。
