internal override IEnumerable <NameExpression> Walk() { List <NameExpression> freeVars = new List <NameExpression>(); freeVars.AddRange(Initializer?.Walk() ?? new NameExpression[0]); freeVars.AddRange(Condition?.Walk() ?? new NameExpression[0]); freeVars.AddRange(Incrementor?.Walk() ?? new NameExpression[0]); freeVars.AddRange(Body.Walk()); if (Initializer is Definition definition) { List <Variable> initializerVariable = new List <Variable> { definition.DeclaredVariable }; Compiler.MatchVariables(freeVars, initializerVariable); } return(freeVars); }