package coffee.liz.lambda.ast; import lombok.NonNull; import java.util.Optional; /** * Represents an expression in the untyped lambda calculus. */ public sealed interface Expression permits Expression.AbstractionExpression, Expression.IdentifierExpression, Expression.ApplicationExpression { Optional comment(); SourceSpan span(); record AbstractionExpression(@NonNull Optional comment, @NonNull SourceSpan span, @NonNull String parameter, @NonNull Expression body) implements Expression { } record ApplicationExpression(@NonNull Optional comment, @NonNull SourceSpan span, @NonNull Expression applicable, @NonNull Expression argument) implements Expression { } record IdentifierExpression(@NonNull Optional comment, @NonNull SourceSpan span, @NonNull String name) implements Expression { } }