module SExpression
  def SExpression.load(text)
    text.tr!(';', '#')
    text.tr!('()', '[]')
    text.gsub!(/\]/, '],')
    text.gsub!(/[\w\d\-+*%]+/){ "'#{$&}'," }
    eval '[' + text + "\n]"
  end

  def SExpression.load_file(file)
    load(File.open(file).read)
  end

  def SExpression.to_se(array, oneline = false)
    ret = ''
    array.each do |a|
      ret << self.array_to_se(a, oneline)
      ret << "\n" unless oneline
    end
    ret
  end

  def SExpression.array_to_se(array, oneline = false, indent = 0)
    ret = ''
    ret << '  ' * indent unless oneline
    ret << '('
    array.each_with_index do |a, i|
      if a.instance_of? Array 
        ret << "\n" + ('  ' * indent) unless oneline
        ret << self.array_to_se(a, oneline, indent + 1)
      else
        ret << a.to_s
      end
      ret << ' ' if array.length - 1 != i
    end
    ret << ')'
  end
end

