Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

说明

本篇文档专门介绍 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 integer
    • signed 16bit integer
    • signed 32bit integer
    • signed 64bit integer
    • signed 128bit integer
  • 无符号:如
    • unsigned 8bit integer
    • unsigned 16bit integer
    • unsigned 32bit integer
    • unsigned 64bit integer
    • unsigned 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 float64bit float 或未来的 128bit float,让读者一眼看懂位宽
  • 在金融、价格、计费等对十进制精度敏感的场景,优先使用 64bit decimal128bit decimal,避免二进制浮点带来的舍入误差

设计原因

  • 工程实践中,双精度已经覆盖绝大部分需求,因此 float 默认指向 64 位浮点。
  • 与其在语言里引入 f32 / f64 等缩写,不如用简洁但语义明确的短语(如 32bit float)表达语义,符合 X “可读性优先”的设计哲学。
  • 大写形式 Float 作为引用类型存在,以支持装箱、运行时对象系统等需求,延续“小写值类型 / 大写引用类型”的整体约定。

布尔类型

语义

布尔类型为 boolean,只有两个字面量:

  • true
  • false
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, ...
  • 字典:强调按键访问,键的类型可以是 stringinteger 等任意可 hash/比较的类型

设计原因

  • 键值映射是现代程序中最常用的数据结构之一,用 {K: V} 这种直观语法可以一眼看出“这是从 K 到 V 的映射”。
  • 同时保留 Dictionary<K, V> 泛型形式,和其他泛型容器(如 List<T>)保持风格一致。

区间类型

语法与语义

X 使用 .. / ..= 表示整数区间(范围):

  • a..b:从 ab不包含 右端点 b
  • a..=b:从 ab包含 右端点 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.mdx-expressions.mdREADME.md)中看到这些类型时,可以把本篇作为一个快速词典来回查它们的含义和设计理由。