Skip to main content

prima_core/
builtins.rs

1use std::sync::OnceLock;
2
3use crate::symbol::{SymbolId, SymbolTable};
4
5/// Built-in symbol set (spec §7.1–7.2): each math constant and operator holds a pre-resolved `SymbolId`,
6/// letting the simplification engine compare symbols in O(1). Physical constants (spec §7.3) are registered in a later release.
7pub struct BuiltinSymbols {
8    pub e: SymbolId,
9    pub pi: SymbolId,
10    pub i: SymbolId,
11    pub tau: SymbolId,
12    pub inf: SymbolId,
13    pub gamma: SymbolId,
14    pub phi: SymbolId,
15    pub sqrt: SymbolId,
16    pub exp: SymbolId,
17    pub log: SymbolId,
18    pub ln: SymbolId,
19    pub sin: SymbolId,
20    pub cos: SymbolId,
21    pub tan: SymbolId,
22    pub sigma: SymbolId,
23    pub prod: SymbolId,
24    pub int: SymbolId,
25    pub partial: SymbolId,
26    pub abs: SymbolId,
27}
28
29// Register math constants and operators (spec §7.1–7.2); the TeX name is used as the display name.
30pub(crate) fn register(t: &SymbolTable) {
31    t.intern_display("e", "\\e");
32    t.intern_display("pi", "\\pi");
33    t.intern_display("i", "\\i");
34    t.intern_display("tau", "\\tau");
35    t.intern_display("infty", "\\infty");
36    t.intern_display("gamma", "\\gamma");
37    t.intern_display("phi", "\\phi");
38    t.intern_display("sqrt", "\\sqrt");
39    t.intern_display("exp", "\\exp");
40    t.intern_display("log", "\\log");
41    t.intern_display("ln", "\\ln");
42    t.intern_display("sin", "\\sin");
43    t.intern_display("cos", "\\cos");
44    t.intern_display("tan", "\\tan");
45    t.intern_display("sigma", "\\sigma");
46    t.intern_display("prod", "\\prod");
47    t.intern_display("int", "\\int");
48    t.intern_display("partial", "\\partial");
49    t.intern_display("abs", "\\mathrm{abs}");
50}
51
52impl BuiltinSymbols {
53    pub fn global() -> &'static BuiltinSymbols {
54        static B: OnceLock<BuiltinSymbols> = OnceLock::new();
55        B.get_or_init(|| {
56            let t = SymbolTable::global();
57            BuiltinSymbols {
58                e: t.intern("e"),
59                pi: t.intern("pi"),
60                i: t.intern("i"),
61                tau: t.intern("tau"),
62                inf: t.intern("infty"),
63                gamma: t.intern("gamma"),
64                phi: t.intern("phi"),
65                sqrt: t.intern("sqrt"),
66                exp: t.intern("exp"),
67                log: t.intern("log"),
68                ln: t.intern("ln"),
69                sin: t.intern("sin"),
70                cos: t.intern("cos"),
71                tan: t.intern("tan"),
72                sigma: t.intern("sigma"),
73                prod: t.intern("prod"),
74                int: t.intern("int"),
75                partial: t.intern("partial"),
76                abs: t.intern("abs"),
77            }
78        })
79    }
80}