说明
本篇文档专门介绍 X 语言中的基础数据类型,按以下几个类别展开:
- 整数类型
- 浮点类型
- 布尔类型
- 字符类型
- 字符串类型
- 元组类型
- 数组类型
- 区间类型
这里的内容以根目录 README.md 的规格为依据,并补充了设计理由与示例,方便从其他语言迁移到 X 的读者快速建立直觉。
整数类型
抽象整数:integer / Integer
X 中的基础整数类型对外有一对名称:
-
integer:值类型(primitive),用于绝大多数计算场景 -
Integer:引用类型(boxed),在需要以对象形式存在(如放入统一的对象容器)时使用 -
抽象上表示数学意义上的整数(…,-2,-1,0,1,2,…)
-
规格上定义为 任意精度整数:理论上只受内存限制,不会像传统 32/64 位整型那样静默溢出
let a: integer = 42
let big: integer = 1_000_000_000_000_000
let sum: integer = a + big
let diff = big - a // 类型推断为 integer
固定位宽整数:完整英文短语形式
在需要与底层平台或其他语言精确对齐时,X 也提供了 固定位宽整数类型的内置别名,并且名称使用完整英文短语 + 空格,避免 i8 / u64 这类缩写和符号化命名:
- 有符号:如
signed 8bit integersigned 16bit integersigned 32bit integersigned 64bit integersigned 128bit integer
- 无符号:如
unsigned 8bit integerunsigned 16bit integerunsigned 32bit integerunsigned 64bit integerunsigned 128bit integer
示例:
let small: signed 8bit integer = 127
let port: unsigned 16bit integer = 8080
let size: unsigned 64bit integer = 1_000_000_000
let mask: unsigned 128bit integer = 0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF
这些类型在语义上对应传统意义上的 int8 / uint64 / int128 / uint128,只是名字更直观;解析时它们被视为内置的多词类型名,不是普通标识符的组合。它们主要用于:
- 与 C/LLVM 等后端的整数类型一一对应
- 需要精确控制大小和溢出行为的性能敏感代码
在一般业务逻辑中,推荐优先使用抽象的 integer(值类型),只在有明确位宽需求时才选用这些别名类型;若需要装箱为对象时,则使用 Integer 引用类型。
设计原因
- 默认的
integer避免 C / Java 风格整型溢出的常见陷阱,特别是在财务、计费和计数场景。 - 通过完整英文短语别名(
signed 8bit integer/unsigned 64bit integer等),在 不牺牲可读性 的前提下,依然可以精确表达底层位宽与符号信息。 - 大写形式
Integer作为引用类型存在,方便在需要对象语义(如运行时反射、统一对象容器)时使用,同时保持“首字母大写 = 引用类型”的统一规则。
浮点类型
抽象浮点:float / Float
X 中的基础浮点类型也有一对名称:
-
float:值类型(primitive),默认对应 64 位双精度 -
Float:引用类型(boxed),用于需要对象语义的场合 -
默认对应 双精度浮点数(与大多数现代语言的
double类似) -
用于近似实数计算:物理量、评分、概率、统计等
let pi: float = 3.1415926535
let radius: float = 2.5
let area: float = pi * radius ^ 2
固定位宽浮点:32bit float / 64bit float 与十进制 decimal
类似整数,X 为浮点数提供了使用简洁完整短语的内置别名(值类型),分为二进制浮点和十进制浮点两类:
- 二进制浮点
32bit float:对应 32 位单精度64bit float:对应 64 位双精度
- 十进制浮点
32bit decimal:32 位十进制浮点64bit decimal:64 位十进制浮点128bit decimal:128 位十进制浮点,适合高精度金融 / 结算场景
示例:
let x: 32bit float = 1.0
let y: 64bit float = 3.1415926535
let price: 64bit decimal = 123.45
let amount: 128bit decimal = 1_000_000_000_000.0001
推荐用法:
- 绝大多数场景使用抽象的
float(默认 64 位) - 需要与外部系统 / 硬件精确对齐时,显式写出
32bit float、64bit float或未来的128bit float,让读者一眼看懂位宽 - 在金融、价格、计费等对十进制精度敏感的场景,优先使用
64bit decimal或128bit decimal,避免二进制浮点带来的舍入误差
设计原因
- 工程实践中,双精度已经覆盖绝大部分需求,因此
float默认指向 64 位浮点。 - 与其在语言里引入
f32/f64等缩写,不如用简洁但语义明确的短语(如32bit float)表达语义,符合 X “可读性优先”的设计哲学。 - 大写形式
Float作为引用类型存在,以支持装箱、运行时对象系统等需求,延续“小写值类型 / 大写引用类型”的整体约定。
布尔类型
语义
布尔类型为 boolean,只有两个字面量:
truefalse
let is-active: boolean = true
let has-error: boolean = false
if is-active and not has-error {
start()
}
设计原因
- 与所有主流语言保持一致,禁止 以
0/1充当真假,减少隐式转换带来的歧义。 - 配合
not/and/or这些关键字式逻辑运算符,让布尔表达式读起来更接近自然语言。
字符类型
语义
字符类型分为:
character:值类型,代表单个 Unicode 字符Character:引用类型,用于需要对象封装时
let ch: character = '中'
let letter: character = 'A'
可用于:
- 解析文本、编写词法分析器
- 单字符处理(如分类、过滤)
设计原因
- 与
String区分,方便编写对“一个字符”的 API,不必总是用长度为 1 的字符串来模拟。 - 使用 Unicode 而不是 ASCII,适应多语言环境。
字符串类型
语义
字符串类型分为:
-
string:值类型,用于绝大多数文本数据场景 -
String:引用类型,提供面向对象的字符串接口 -
普通字符串:
"..."(支持转义) -
多行字符串:
""" ... """(保留缩进和换行) -
插值字符串:
"Hello, {name}!"
let greeting: string = "Hello, X"
let multi = """
多行字符串
保留格式
"""
let name: string = "Alice"
let msg: string = "Hello, {name}!" // 插值
设计原因
- 字符串是最常用的基础类型之一,直接在语法层面支持多行与插值,减少模板拼接的样板代码。
- 插值风格与很多现代语言(Kotlin、C#、TS 模板字符串等)类似,降低迁移成本。
元组类型
语义
X 支持使用括号 (...) 表示位置元组,可以包含多个不同类型的元素:
let pair = (1, "one")
let triple = (user-id, is-active, last-login)
常见用途:
- 从函数返回多个值
- 在推导式或管道中组合临时数据
解构
元组可以通过 let 解构成多个绑定:
let (x, y) = (10, 20)
let (id, name) = (user.id, user.name)
设计原因
- 与记录类型
{ x: ..., y: ... }相比,元组更适合“一次性、局部的小组合”,无需命名字段。 - 对齐许多现代语言(Rust、Kotlin、Python)的设计,让“多返回值”等模式更自然。
数组类型
说明:在当前实现中,顺序集合的主要一等类型是
List<T>(以及语法糖[T]),用于大多数“数组场景”。本节中的“数组”更多是概念层面的描述:固定长度、连续存储的序列,底层通常由后端或标准库实现。
语义
数组可以理解为:
- 元素类型统一
- 长度在创建时固定
- 内存上通常连续存储(便于与 C / 低层 API 交互)
一个可能的数组声明示例(以概念说明为主):
// 概念示意:长度为 4 的 Integer 数组
let xs: Array<Integer> = [1, 2, 3, 4]
与 List<T> 的区别(设计意图):
List<T>:面向通用业务代码,可变长、高层抽象,配合管道、推导式使用。- 数组:面向性能敏感 / 底层交互场景,长度固定、布局可预测,更接近 C 风格数组。
设计原因
- 不在语言层面强制引入大量数组语法,而是以
List<T>作为默认顺序容器,简化心智模型。 - 为将来在标准库中提供高性能数组类型(如
Array<T>、FixedArray<T, N>)保留空间,同时保持语法上的直观度。
字典类型
语义
字典类型用于表示键值映射,在 X 中有两种等价写法:
- 泛型形式:
Dictionary<K, V> - 语法糖形式:
{K: V}(更常用)
let scores: {string: integer} = {
"alice": 90,
"bob": 80
}
let id_to_user: {integer: User} = {
1: user1,
2: user2
}
这里:
- 花括号外层表示“这是一个字典类型”
- 冒号左边是键类型,右边是值类型
典型用途
- 配置项(按 key 查 value)
- 缓存 / 索引结构(按 id 查实体)
- 频率统计(某个键出现次数)
与数组 / 列表的区别
- 数组 / 列表:强调顺序,通过整数下标访问(
0, 1, 2, ...) - 字典:强调按键访问,键的类型可以是
string、integer等任意可 hash/比较的类型
设计原因
- 键值映射是现代程序中最常用的数据结构之一,用
{K: V}这种直观语法可以一眼看出“这是从 K 到 V 的映射”。 - 同时保留
Dictionary<K, V>泛型形式,和其他泛型容器(如List<T>)保持风格一致。
区间类型
语法与语义
X 使用 .. / ..= 表示整数区间(范围):
a..b:从a到b,不包含 右端点ba..=b:从a到b,包含 右端点b
let r1 = 0..10 // 0, 1, ..., 9
let r2 = 1..=3 // 1, 2, 3
区间在很多地方可以直接使用:
for循环- 列表推导式
for i in 0..10 {
println(i)
}
let squares = [x^2 | x in 1..=5] // [1, 4, 9, 16, 25]
设计原因
- 区间在数学和日常编程中非常常见,用专门语法表示可以减少“魔法数字 + 比较”的样板代码。
- 与 Rust、Swift 等语言类似的
../..=设计,降低学习成本,同时在语义上精确区分“左闭右开”和“左闭右闭”。
总结
本篇从 整数、浮点、布尔、字符、字符串、元组、数组、区间 八个角度,介绍了 X 的基础数据类型设计思路:
- 在语义上尽量简单、明确(如任意精度
Integer、区间语法表达边界) - 在命名和行为上对齐主流语言的直觉,减少迁移成本
- 在表达能力上为更高层的抽象(Record、ADT、
Option/Result、集合推导等)提供扎实基础
当你在其他文档(如 x-keywords.md、x-expressions.md 和 README.md)中看到这些类型时,可以把本篇作为一个快速词典来回查它们的含义和设计理由。