 			operators[ST_THROW] = function(e:*):* { throw e; };
 			
 			// 'if' statement can be considered a pure operator
-			pureOperators[ST_IF] = function(c:*, t:*, f:*):* { return c ? t : f; };
+			pureOperators[ST_IF] = blockOperators[ST_IF];
 			// math
 			pureOperators["**"] = Math.pow;
 			pureOperators["*"] = function(x:*, y:*):Number { return x * y; };

			};
			operators[ST_VAR] = function(..._):*{};
			operators[ST_IMPORT] = function(..._):*{};
			// loop statements
			operators[ST_DO] = function(x:*, y:*):* { return x && y; };
			operators[ST_WHILE] = function(x:*, y:*):* { return x && y; };
			operators[ST_FOR] = function(x:*, y:*):* { return x && y; };
			operators[ST_FOR_DO] = function(x:*, y:*):* { return x && y; };
			operators[ST_FOR_IN] = function(..._):*{};
			operators[ST_FOR_EACH] = function(..._):*{};
			// jump statements
			operators[ST_BREAK] = function(..._):*{};
			operators[ST_CONTINUE] = function(..._):*{};

			globals = {};
			operators = {};
			pureOperators = {};
			assignmentOperators = {};
			blockOperators = {};
			
			// constant, built-in symbols
			for each (var _const:* in [null, true, false, undefined, NaN, Infinity])
