字面量详解

字面量 (Literals) 是源代码中直接表示固定值的文本表示。它们是构建程序逻辑和数据的基本元素。Flurry 提供了丰富且灵活的字面量语法,以精确地表示各种常见类型的值。

1. 整数 (Integer)

整数用于表示没有小数部分的数值。

  • 十进制 (Decimal): 最常见的形式。
    123
    0
    -42
    
  • 不同进制:
    • 二进制 (Binary): 以 0b0B 开头。
      0b101010 -- == 42
      0B1111_0000
      
    • 八进制 (Octal): 以 0o0O 开头。
      0o777 -- == 511
      0O123_456
      
    • 十六进制 (Hexadecimal): 以 0x0X 开头。
      0xFF -- == 255
      0xCafeBabe
      0Xdead_beef
      
  • 类型后缀 (Type Suffix): 可以通过后缀指定具体的整数类型。常见的后缀包括 u8, i32, u64, isize, usize 等(具体可用后缀依赖于语言标准库定义)。如果省略后缀,编译器会根据上下文尝试推断类型,或使用默认类型(例如 i32)。
    100i32
    42u8
    0xFF_u64
    
  • 下划线分隔符 (_): 为了提高可读性,可以在数字之间使用下划线 _ 作为分隔符。下划线会被编译器忽略。注意,字面量的第一个字符不能是下划线(除非是负号后的第一个数字)。
    1_000_000
    0b1111_0000_1010_0101
    

2. 浮点数 (Float)

浮点数用于表示可能带有小数部分的数值。

  • 基本形式: 必须包含小数点 . 或指数标记 e/E
    3.14159
    -0.5
    100.0 -- 即使小数部分为 0,也表示浮点数
    1. -- 合法,等同于 1.0 (如果语法允许)
    .5 -- 可能非法,通常需要小数点前有数字
    
  • 科学计数法 (Scientific Notation): 使用 eE 表示 10 的幂。
    1.23e4  -- == 12300.0
    -5.67E-3 -- == -0.00567
    
  • 类型后缀 (Type Suffix): 可以使用 f32f64 后缀指定精度。如果省略,编译器通常会推断或默认使用 f64
    2.718f32
    -42.0f64
    1e6f64 -- 1 百万,64 位浮点数
    
  • 下划线分隔符 (_): 同样可用,规则与整数相同。
    3_141_592.653_589f64
    1_000e-3_f32 -- == 1.0f32
    

3. 字符 (Character)

字符表示单个 Unicode 标量值,用单引号 ' ' 括起来。

  • 普通字符:
    'a'
    'Z'
    '7'
    '_'
    
  • 转义序列 (Escape Sequences): 使用反斜杠 \ 进行转义,支持常见转义:
    • \': 单引号
    • \\: 反斜杠
    • \n: 换行符 (Newline)
    • \r: 回车符 (Carriage Return)
    • \t: 水平制表符 (Horizontal Tab)
    • (可能还有其他,如 \0 空字符等)
    '\'' -- 表示单引号字符
    '\\' -- 表示反斜杠字符
    '\n'
    
  • Unicode 转义: 使用 \x{...} 形式,花括号内是 1 到 6 位的十六进制 Unicode 码点。
    '\x{41}' -- == 'A'
    '\x{3A3}' -- == 'Σ' (希腊字母 Sigma)
    '\x{1F600}' -- 😀 (笑脸 Emoji)
    

4. 字符串 (String)

字符串表示一系列字符,用双引号 " " 括起来。

  • 基本字符串:
    "Hello, Flurry!"
    "这是一个包含 Unicode 的字符串:你好 Σ 😀"
    "" -- 空字符串
    
  • 转义序列: 字符串内部支持与字符字面量相同的转义序列。
    "第一行\n第二行\t缩进"
    "路径是: \"C:\\Program Files\\\""
    
  • 字面量合并 (Concatenation): 多个相邻的字符串字面量(仅由空白分隔)会被编译器自动合并成一个单一的字符串。这对于书写长字符串或跨行书写很有用。
    let long_message = "这是第一部分, "
                       "这是第二部分, "
                       "这是最后一部分.";
    -- 等价于: let long_message = "这是第一部分, 这是第二部分, 这是最后一部分.";
    
  • 原始字符串 (Raw Strings): 对于需要包含大量特殊字符(如正则表达式、代码片段、多行文本)而无需转义的情况,可以使用原始字符串,其通过builtin.raw_str宏提供,{} 内的所有内容(包括换行符)都将按原样成为字符串的一部分。
    -- 假设语法
    let regex_pattern = builtin.raw_str'{^\d{4}-\d{2}-\d{2}$}
    let multi_line = builtin.raw_str'{
    这是一个多行文本,
    内部的 "引号" 和 \ 反斜杠
    都无需转义。
    }
    
  • 编译时类型: 需要特别指出的是,在 Flurry 中,字符串字面量 "..." 本身很可能属于编译时类型 str (或类似的代数字符串类型),它代表了编译时已知的文本内容。这使得它们可以用于 comptime 计算和字符串插值。运行时的、可变的或堆分配的字符串可能是另一种类型(例如 String)。
  • 编译时插值 ($variable): 字符串字面量支持使用 $identifier 的形式嵌入编译时已知的变量或常量的值。
    comptime const VERSION = "0.1.0";
    const MESSAGE = "Welcome to Flurry version $VERSION!";
    -- MESSAGE 的值在编译时确定为 "Welcome to Flurry version 0.1.0!"
    
    注意:这与运行时的字符串格式化(例如 println 中使用的 {} 占位符)是不同的概念。
  • 变体后缀 (Variant Suffixes): 字符串字面量后可以跟特定的标识符后缀来创建特殊类型的字符串表示:
    • "..."c (C String Variant): 创建一个与 C 语言 ABI 兼容的字符串表示,通常意味着以空字符 (\0) 结尾,并可能使用特定的编码(如 UTF-8)。用于 FFI 交互。
    • "..."b (Byte String Variant): 将字符串字面量的内容解释为一个字节序列(通常是 Slice<u8> 或类似类型),忽略其文本编码。用于处理原始二进制数据。

5. 布尔值 (Boolean)

表示逻辑真或假。

  • true: 真
  • false: 假

它们是 Flurry 的内置布尔类型 (bool) 的唯二值。

6. null 字面量

null 是一个特殊的字面量,用于表示 Flurry 中可选类型 (?T) 的“无值”状态。它本身可能没有独立的类型,而是作为可选类型的特殊值存在。

let maybe_value: ?i32 = null;

7. 符号 (Symbol)

符号是一种独特的字面量类型,以点 . 开头,后跟一个标识符。它们代表编译时唯一的标识符常量。具体细节将在 符号 章节中讨论。

.ok
.error
.my_custom_symbol

掌握 Flurry 丰富而精确的字面量表示法,是有效利用其类型系统和编译时能力的基础。