Metastatic.Adapters.Erlang
(Metastatic v0.10.4)
View Source
Erlang language adapter for MetaAST transformations.
Bridges between Erlang AST (M1) and MetaAST (M2), enabling cross-language code analysis and transformation for Erlang source code.
Erlang AST Structure (M1)
Erlang represents AST as tuples with specific structures. The format varies by construct but generally follows patterns like:
{Type, Line, Value}
{Type, Line, Left, Right}Examples
# Integer literal
{:integer, 1, 42}
# Variable
{:var, 1, :X}
# Binary operation (addition)
{:op, 1, :+, {:var, 1, :X}, {:integer, 1, 5}}
# Function call
{:call, 1, {:atom, 1, :foo}, [{:integer, 1, 1}, {:integer, 1, 2}]}
# Case expression
{:case, 1, {:var, 1, :X},
[{:clause, 1, [{:integer, 1, 1}], [], [{:atom, 1, :ok}]}]}M1 ↔ M2 Transformations
This adapter performs bidirectional transformations between Erlang AST (M1) and MetaAST (M2):
Literals
# M1 → M2
{:integer, _, 42} → {:literal, :integer, 42}
{:float, _, 3.14} → {:literal, :float, 3.14}
{:string, _, 'hello'} → {:literal, :string, "hello"}
{:atom, _, true} → {:literal, :boolean, true}
{:atom, _, undefined} → {:literal, :null, nil}Variables
{:var, _, :X} → {:variable, "X"}Binary Operations
{:op, _, :+, left, right} → {:binary_op, :arithmetic, :+, left, right}
{:op, _, :==, left, right} → {:binary_op, :comparison, :==, left, right}Function Calls
{:call, _, func, args} → {:function_call, "func", args}Round-Trip Fidelity
The adapter achieves >90% round-trip fidelity for M2.1 (Core) constructs. Metadata preserves:
- Line numbers
- Variable names (case-sensitive)
- Erlang-specific type information
Usage
# Parse Erlang source
{:ok, ast} = Metastatic.Adapters.Erlang.parse("X + 5.")
# Transform to MetaAST
{:ok, meta_ast, metadata} = Metastatic.Adapters.Erlang.to_meta(ast)
# Transform back to Erlang AST
{:ok, ast2} = Metastatic.Adapters.Erlang.from_meta(meta_ast, metadata)
# Unparse to source
{:ok, source} = Metastatic.Adapters.Erlang.unparse(ast2)Theory
This adapter implements the Galois connection:
α_Erlang: AS_Erlang → MetaAST × Metadata
ρ_Erlang: MetaAST × Metadata → AS_ErlangWhere:
α_Erlangisto_meta/1(abstraction)ρ_Erlangisfrom_meta/2(reification)