moonbit-eetf

    Erlang External Term Format 编解码(Atom/Integer/Float/List/Tuple/Map/Binary/PID/Port/Reference;纯核零依赖;真帧金罐)

    erlang
    etf
    external-term-format
    codec
    moonbit
    Download zip
    Author
    Version
    0.0.3
    License
    Apache-2.0
    Last updated
    12 hours ago
    Downloads
    13

    No dependencies

    #moonbit-eetf

    Erlang External Term Format(EETF)编解码(MoonBit 纯核):覆盖 Atom、 Integer、Float、List、Tuple、Map、Binary、PID、Port、Reference 十族项。 设计忠于 OTP26 ERTS external term format(external.h/c 真源)+真帧金罐 (strace 逐字节对拍);clean-room 重写,零源码拷贝。

    核心包零依赖:纯编解码(无传输/无时钟/无随机), decode/encode 全函数式, 往返守恒律金罐守护(encode(decode(x))==x 规范形)。

    #包结构

    包内容
    thy1016/moonbit-eetfEtfTerm 值域 + decode/encode 纯核(唯一包,极薄)

    状态:0.0.1 骨架(阶段 1)。0.x 实验期,API 仍可能调整。

    #特性

    • 十族项覆盖:atom 四形归一('d'/'v'/'w'/'s')、int 两形(97/98)、 NEW_FLOAT(70)、tuple 两形(104/105)、list(108+106 nil)、binary(109)、 string(107)、map(116)、pid('X')、port(NEW_PORT)、ref('Z'/'r' 双形)。
    • 规范形输出:atom→'w'(OTP26 主形)、float→'F'、ref→'Z'(creation u32) ——往返=规范形守恒。
    • 诚实拒:缺 magic/截断/未知 tag/improper list 全部显式 EtfError(Truncated/Malformed),零静默默认臂。
    • 真帧金罐:逐类型硬编码帧字节(OTP26 真形)+深嵌套往返守恒矩阵。

    #测试门

    moon check --deny-warn && moon test --target native

    演进位:gen 化(tag 词表 TOML 化→表驱动解码器,契约 〇)、'R' cache ref attab 语境接线(dist 头语境)、improper list 支持(候选)、BIG 整数族 (110/111)。见 spec.md §五。

    #仓库

    • mooncakes 名: thy1016/moonbit-eetf
    • 仓库: git@gitlink.org.cn:thy7/mbt.eetf.git(master)
    • 孵化: bitbang 主仓孵化件独立入库(2026-11-06;孵化期零跨仓 import——组合根候 mooncakes 发版后 moon add 接线)

    EtfError

    pub(all) suberror EtfError {
    Truncated(String)
    Malformed(String)
    DepthExceeded(String)
    }

    EtfTerm

    pub(all) enum EtfTerm {
    EAtom(String)
    EInt(Int)
    EFloat(Double)
    EList(Array[EtfTerm])
    ETuple(Array[EtfTerm])
    EMap(Array[(EtfTerm, EtfTerm)])
    EBinary(Bytes)
    EString(String)
    EPid(String, Int, Int, Int)
    EPort(String, Int, Int)
    ERef(String, Int, Int, Int)
    ENil
    }

    EtfTerm::show

    fn EtfTerm::show(self : EtfTerm) -> String

    文本面(罐测输出用;手写防 0079 晋升+零依赖)

    TAG_ATOM_CACHE_REF

    let TAG_ATOM_CACHE_REF : Int

    cix u8('D' 段头语境;A8 全规格)

    TAG_ATOM_EXT

    let TAG_ATOM_EXT : Int

    latin-1 atom, len u16

    TAG_ATOM_UTF8

    let TAG_ATOM_UTF8 : Int

    len u16

    TAG_BINARY

    let TAG_BINARY : Int

    len u32

    TAG_FLOAT_EXT

    let TAG_FLOAT_EXT : Int

    31-byte string form (legacy)

    TAG_INTEGER

    let TAG_INTEGER : Int

    i32 big-endian

    TAG_LARGE_TUPLE

    let TAG_LARGE_TUPLE : Int

    arity u32

    TAG_LIST

    let TAG_LIST : Int

    len u32 + tail

    TAG_MAP

    let TAG_MAP : Int

    TAG_NEW_FLOAT

    let TAG_NEW_FLOAT : Int

    tag 词表常量(external.h 权威——数据面;真源=词表 TOML) IEEE double, 8-byte big-endian

    TAG_NEW_PID

    let TAG_NEW_PID : Int

    pid ext, node/id/serial/creation u32

    TAG_NEW_PORT

    let TAG_NEW_PORT : Int

    TAG_NEW_PORT_V2

    let TAG_NEW_PORT_V2 : Int

    TAG_NEW_REFERENCE

    let TAG_NEW_REFERENCE : Int

    reference ext, creation u32('Z' 形)

    TAG_NIL

    let TAG_NIL : Int

    TAG_SMALL_ATOM_UTF8

    let TAG_SMALL_ATOM_UTF8 : Int

    len u8(external.c get_int8)

    TAG_SMALL_BIG

    let TAG_SMALL_BIG : Int

    digit count u8

    TAG_SMALL_INTEGER

    let TAG_SMALL_INTEGER : Int

    u8

    TAG_SMALL_TUPLE

    let TAG_SMALL_TUPLE : Int

    arity u8

    TAG_STRING

    let TAG_STRING : Int

    latin-1 byte string, len u16

    VERSION_MAGIC

    let VERSION_MAGIC : Int

    VERSION_MAGIC(版本面非 tag 词表面;tag 词表真源=protocol/etf_tags.toml, 产物=gen_tags.mbt——勿手改,改词表后由 erlgen 再生)

    all_tags

    fn all_tags() -> Array[(Int, String)]

    词表全表 (code, name)

    decode

    fn decode(data : Bytes, attab? : Array[String]) -> EtfTerm raise EtfError

    读入口:带 VERSION_MAGIC 的整帧(0x83 起);无 magic 诚实拒

    decode_term

    fn decode_term(data : Bytes, pos : Int, attab? : Array[String]) -> (EtfTerm, Int) raise EtfError

    读入口(无 magic,段内):返回 (term, 下一 pos)——组合用

    encode

    fn encode(t : EtfTerm) -> Bytes raise EtfError

    encode_term

    fn encode_term(t : EtfTerm, out : Array[Byte]) -> Unit raise EtfError

    段内编码(无 magic):组合用

    tag_name_of

    fn tag_name_of(code : Int) -> String?

    封闭查表:tag code → 词表名(未知 None——负例诚实拒)