=begin
    rubymacros - a macro preprocessor for ruby
    Copyright (C) 2008, 2016  Caleb Clausen

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
=end

macro separated_scope
  code=yield
  localnames=[]
  code.depthwalk{|parent,i,j,node|
    if RedParse::VarNode===node
      node.name<<'_'
      localnames<<node.name
    end
  }
  :(
    ^localnames.uniq.inject(:(nil)){|sum,lvar| 
      RedParse::AssignNode[ RedParse::VarNode[lvar],'=',sum ] 
    }
    eval local_variables.map{|lvar| "#{lvar}_ = #{lvar}" }.join(';')
    ^code
  )
end

a = 10
separated_scope do
a = a + 1
p a #=>11
end 
p a #=>10
