refactor assign ast.
diff --git a/ast.go b/ast.go
index 137c29a..4525136 100644
--- a/ast.go
+++ b/ast.go
@@ -1,5 +1,7 @@
 package main
 
+import "fmt"
+
 type AST interface {
 	eval(*Evaluator)
 	show()
@@ -10,24 +12,28 @@
 	lineno   int
 }
 
-const (
-	ASSIGN_SIMPLE      = iota // :=
-	ASSIGN_RECURSIVE          // =
-	ASSIGN_APPEND             // +=
-	ASSIGN_CONDITIONAL        // ?=
-)
-
 type AssignAST struct {
 	ASTBase
-	lhs         string
-	rhs         string
-	assign_type int
+	lhs string
+	rhs string
+	op  string
 }
 
 func (ast *AssignAST) eval(ev *Evaluator) {
 	ev.evalAssign(ast)
 }
 
+func (ast *AssignAST) evalRHS(ev *Evaluator) string {
+	switch ast.op {
+	case ":=":
+		return ev.evalExpr(ast.rhs)
+	case "=":
+		return ast.rhs
+	default: // "+=", "?="
+		panic(fmt.Sprintf("not implemented assign op: %q", ast.op))
+	}
+}
+
 func (ast *AssignAST) show() {
 	Log("%s=%s", ast.lhs, ast.rhs)
 }