取像操作 (expr ' image)
Flurry 引入了一种独特且强大的后缀操作符——取像操作 ('
),用于获取一个表达式在不同抽象层面或元数据维度的“像 (Image)”。这个操作符提供了一个统一的语法入口,访问与表达式相关的编译时信息、运行时表示或其他关联属性。
语法
取像操作的基本语法形式为:
expression ' image_identifier
expression
: 任何有效的 Flurry 表达式。'
(单引号): 取像操作符。image_identifier
: 一个标识符,指定想要获取的“像”的类型。这个标识符不是变量或关键字,而是由 Flurry 编译器内部识别的、用于特定取像操作的名称。
根据您提供的优先级表 (OpTable
),取像操作符 '
具有很高的优先级 (100),确保它紧密绑定其左侧的 expression
。
概念与用途
“取像”可以理解为获取表达式 expression
的某个特定方面或表示:
-
元数据 (Metadata): 获取与表达式相关的元信息。
expression ' type
: 获取表达式在编译时确定的类型。结果本身是一个编译时Type
类型的值。let x = 10; comptime let type_of_x = x'type; -- type_of_x 的值是代表 i32 (或默认整数类型) 的 Type 对象
enum_value ' tag_name
: 获取枚举值当前变体的名称(作为一个编译时常量字符串)。enum Status { ok, loading, error } let current = Status.loading; comptime let name = current'tag_name; -- name 的值是 "loading"
-
抽象表示 (Abstract Representation): 获取表达式底层数据的一种抽象视图。
value ' bitvec
: 获取值value
在内存中的位向量 (Bit Vector) 表示。结果是一个编译时可知长度(基于value
的类型)的BitVec<N>
抽象类型,可以用于编译时的位操作(编译器会优化为高效的机器指令)。let flags: u8 = 0b1010_0101; comptime let bv = flags'bitvec; -- comptime let first_nybble = bv.slice(0..4); -- 假设 bitvec 支持切片
-
关联操作或转换 (Associated Operation / Transformation): 触发某种与表达式相关的特殊操作。
dst_pointer ' dst_deref
: (用于动态大小类型 DST) 这不是获取一个简单的值,而是触发一种特殊的解引用操作,允许对 DST 指针指向的内容进行模式匹配或访问,编译器会根据指针指向的实际数据(例如tagged_polymorphic
枚举的 tag)来确定如何解释内存。tuple ' enumerate
: (用于元组) 可能返回一个包含(元素, 索引)
对的迭代器或编译时可展开的序列,用于inline for
。
编译时与运行时
取像操作的结果可能是:
- 编译时常量: 如
'type
的结果是编译时Type
,'tag_name
的结果是编译时str
。这些结果可以直接用于comptime
代码块和编译时条件判断。 - 运行时值: 如
'bitvec
得到的是一个抽象表示,但最终的操作会生成运行时代码。'dst_deref
也是在运行时执行的特殊解引用。'enumerate
可能产生运行时迭代器。 - 操作触发器: 某些“像”可能不直接返回值,而是触发编译器执行特定的分析或代码生成过程。
编译器负责根据 image_identifier
确定具体的语义和结果类型。
内置的 "像"
Flurry 语言会预定义一系列有用的 image_identifier
。一些我们已经讨论过的或可能的例子包括:
'type
: 获取编译时类型。'tag_name
: 获取枚举变体名(字符串)。'bitvec
: 获取位向量抽象视图。'dst_deref
: 用于 DST 指针的特殊解引用/匹配。'enumerate
: 用于元组或其他序列的带索引迭代。- (可能还有
'size
获取类型大小,'alignment
获取对齐,'address
获取地址等)
这个列表是由语言定义和编译器内置的,开发者不能自定义新的 'image_identifier
。
设计优势
- 统一语法: 为多种不同的元信息查询和底层操作提供了一致的后缀语法。
- 简洁:
expr'type
比get_type(expr)
或typeof(expr)
更简洁。 - 与编译时系统集成: 许多“像”直接产生编译时值,无缝融入
comptime
计算。 - 表达力: 提供了访问语言底层信息和触发特殊操作的强大能力。
总结
取像操作 (expr ' image
) 是 Flurry 中一个富有创新性的特性。它通过一个简洁的后缀操作符 '
和编译器内置的 image_identifier
,提供了一个统一的接口来访问表达式的类型、元数据、抽象表示或触发特殊操作。这是 Flurry 强大的编译时元编程和底层控制能力的又一体现。