package registry // An Expr is a type-erased lambda calculus expression. It can have any type of // representation, so long as that type is known to the registry it is handled // by. type Expr interface { // Repr returns the name of the underlying representation. Two expressions // with the same Repr() are assumed to have the same representation type. Repr() string // Data returns the underlying expression data. Data() any } // A baseExpr is the default implementation of Expr. type baseExpr struct { id string data any } func (e baseExpr) Repr() string { return e.id } func (e baseExpr) Data() any { return e.data } // NewExpr creates an Expr with the given representation name and data. func NewExpr(id string, data any) Expr { return baseExpr{id, data} }