 
 	if tok[1] == '='
 		# var (re)assign (a = expr)
-		if _context[fst] == undefined
+		if getvar(fst) == undefined
 			err "Variable #{fst} not in context!"
 			return
-		_context[fst] = evaluate tok[2..]
-		debug "Var reassign: #{fst} = #{_context[fst]}"
+		setvar fst, evaluate(tok[2..]), true
+		debug "Var reassign: #{fst} = #{getvar fst}"
 		return lineno + 1
 
 	if tok[1] == ':='
 		#var first assign (a := expr) - may shadow a pre-existing variable
-		_context[fst] = evaluate tok[2..]
-		debug "Var define: #{fst} := #{_context[fst]}"
+		setvar fst, evaluate tok[2..]
+		debug "Var define: #{fst} := #{getvar fst}"
 		return lineno + 1
 	
 	err "[aborted] Invalid line: #{line} @ #{lineno}"

	a = parseFloat name
	if a == a
		return a
	return _context[name] # may be nil

# evaluates a series of tokens, which may be:
# var1 (arith-op) var2

		if fstch == '#'
			labelno = tonumber tok[1][1..]
		else if fstch == '@'
			labelno = getvar tok[1][1..]
		else
			if _labels[tok[1]] == undefined
				err "Label #{tok[1]} not found!"
