Hello all,

  in different languages there is need to mark variables as
  global/local, const/variable, integer/float and so on. there is
  several methods to do this markup:

  1) in variable name. f.e. constants and global vars in ruby
  indicated by variable name: Array, $global

  2) by declararation. f.e. type declarators in C or Pascal

  3) by definition, i.e. declararion combinated with some action. as
  example - using ':=' to declare var as local PLUS execute '='


  first is definitely better if kind of variable can't be changed
  while program grows; third - when there is only one kind of actions,
  which can be combined with declaration


  to mark vars as local to block we can use any of methods above. but
  imho it is better to explicitly declare vars imported from outer
  blocks:

  a = 1
  {
    a = 2  # ruby prints warning - outer var used without explicit import
    {
      import a
      a = 3      # OK - changing value of imported variable
      {
        local a  # bad style - reusing outer variable name.
                 # suitable only for metaprogramming
        a = 4
      }
      { local a=4 }  # same as above, but more suitable for one-liners
    }
  }

  p a  #=> 3


  proposed style is a less cryptish than other variants and conforms
  to principle of least surprise in my vision

-- 
Best regards,
 Bulat                          mailto:bulatz / integ.ru