// ===== EtfTerm:Erlang 项值的 MoonBit 表示(骨架 v0 覆盖面)=====
// 覆盖用户清单:Atom/Integer/Float/List/Tuple/Map/Binary/PID/Port/Reference。
// EString=STRING_EXT( latin1 list 快捷形);ENil=NIL_EXT(列表尾)。
///|
pub(all) enum EtfTerm {
EAtom(String) // 97/100/115/118/119——latin1/utf8 atom 四形归一
EInt(Int32) // 97/98(small/32bit)
EFloat(Double) // 70/99/110(NEW_FLOAT 为主)
EList(Array[EtfTerm]) // 108 LIST + 106 nil 尾(规约:proper list)
ETuple(Array[EtfTerm]) // 104/105
EMap(Array[(EtfTerm, EtfTerm)]) // 116 键值对保序
EBinary(Bytes) // 109
EString(String) // 107(latin1 串——整数字节列快捷形)
EPid(String, Int32, Int32, Int32) // 88/103:node, id, serial, creation
EPort(String, Int32, Int32) // 89/102:node, id, creation
ERef(String, Int32, Int32, Int32) // 90/114:node, id, serial(骨架恒 0), creation
ENil // 106(空列表尾)
}
///|
/// 文本面(罐测输出用;手写防 0079 晋升+零依赖)
pub fn EtfTerm::show(self : EtfTerm) -> String {
match self {
EtfTerm::EAtom(s) => "Atom(\{s})"
EtfTerm::EInt(v) => "Int(\{v})"
EtfTerm::EFloat(f) => "Float(\{f})"
EtfTerm::EList(items) => {
let parts : Array[String] = []
for it in items {
parts.push(it.show())
}
"[\{parts.join(",")}]"
}
EtfTerm::ETuple(items) => {
let parts : Array[String] = []
for it in items {
parts.push(it.show())
}
"{\{parts.join(",")}}"
}
EtfTerm::EMap(pairs) => {
let parts : Array[String] = []
for pr in pairs {
parts.append([pr.0.show(), " => ", pr.1.show()])
}
"#\{parts.join(",")}"
}
EtfTerm::EBinary(_) => "Binary(..)"
EtfTerm::EString(s) => "String(\{s})"
EtfTerm::EPid(node, id, serial, creation) =>
"Pid(\{node},\{id},\{serial},\{creation})"
EtfTerm::EPort(node, id, creation) => "Port(\{node},\{id},\{creation})"
EtfTerm::ERef(node, id, serial, creation) =>
"Ref(\{node},\{id},\{serial},\{creation})"
EtfTerm::ENil => "nil"
}
}
///|
/// VERSION_MAGIC(版本面非 tag 词表面;tag 词表真源=protocol/etf_tags.toml,
/// 产物=gen_tags.mbt——勿手改,改词表后由 erlgen 再生)
pub const VERSION_MAGIC : Int32 = 131