change newOldVar to Vars.save
diff --git a/func.go b/func.go
index 333ac92..7d949fc 100644
--- a/func.go
+++ b/func.go
@@ -561,10 +561,10 @@
 		Log("call $%d: %q=>%q", i+1, arg, args[i])
 	}
 
-	var olds []oldVar
+	var restores []func()
 	for i, arg := range args {
 		name := fmt.Sprintf("%d", i+1)
-		olds = append(olds, newOldVar(ev.outVars, name))
+		restores = append(restores, ev.outVars.save(name))
 		ev.outVars.Assign(name,
 			SimpleVar{
 				value:  arg,
@@ -574,8 +574,8 @@
 
 	var buf bytes.Buffer
 	v.Eval(&buf, ev)
-	for _, old := range olds {
-		old.restore(ev.outVars)
+	for _, restore := range restores {
+		restore()
 	}
 	Log("call %q return %q", f.args[0], buf.Bytes())
 	w.Write(buf.Bytes())
@@ -669,7 +669,8 @@
 	varname := string(ev.Value(f.args[0]))
 	list := ev.Values(f.args[1])
 	text := f.args[2]
-	old := newOldVar(ev.outVars, varname)
+	restore := ev.outVars.save(varname)
+	defer restore()
 	space := false
 	for _, word := range list {
 		ev.outVars.Assign(varname,
@@ -683,5 +684,4 @@
 		w.Write(ev.Value(text))
 		space = true
 	}
-	old.restore(ev.outVars)
 }