ast: add Ident, FuncCall nodes and Statement interface (ExprStmt, FuncDef)

- Ident{Name}: variable reference node (sealed, implements Node)
- FuncCall{Name, Args}: function call node (sealed, implements Node)
- Statement interface: sealed, for top-level REPL input
- ExprStmt{Expr}: wraps expression as statement
- FuncDef{Name, Params, Body}: function definition statement
diff --git a/ast/ast.go b/ast/ast.go
index f1e953d..627a623 100644
--- a/ast/ast.go
+++ b/ast/ast.go
@@ -24,3 +24,41 @@
 }
 
 func (*BinaryExpr) node() {}
+
+// Ident represents a variable reference (e.g. x, y).
+type Ident struct {
+	Name string
+}
+
+func (*Ident) node() {}
+
+// FuncCall represents a function call (e.g. f(1, 2+3)).
+type FuncCall struct {
+	Name string
+	Args []Node
+}
+
+func (*FuncCall) node() {}
+
+// Statement is the interface for top-level REPL input.
+// A line is either an expression to evaluate or a function definition.
+// The unexported marker method seals the interface.
+type Statement interface {
+	stmt() // sealed marker
+}
+
+// ExprStmt wraps an expression as a top-level statement.
+type ExprStmt struct {
+	Expr Node
+}
+
+func (*ExprStmt) stmt() {}
+
+// FuncDef represents a function definition (e.g. f(x, y) = x + y).
+type FuncDef struct {
+	Name   string
+	Params []string
+	Body   Node
+}
+
+func (*FuncDef) stmt() {}