Sha256: 43d2ee47b53579e856ea4a78bbba2109b0db8767a31be1945333f6710127d4bc

Contents?: true

Size: 1.79 KB

Versions: 2

Compression:

Stored size: 1.79 KB

Contents

# This class contains our logic for parsing
# S-Expressions. They are turned into a 
# native Ruby representation like:
#   [:def, :something [:lambda, [:a], [:do_something]]]
class Sexpistol

  attr_accessor :ruby_keyword_literals, :scheme_compatability

  # Parse a string containing an S-Expression into a
  # nested set of Ruby arrays
  def parse_string(string)
    tree = SexpistolParser.new(string).parse
    return convert_ruby_keyword_literals(tree) if(@ruby_keyword_literals)
    return tree
  end

  # Convert symbols corresponding to Ruby's keyword literals
  # into their literal forms
  def convert_ruby_keyword_literals(expression)
    return recursive_map(expression) do |x|
      case x
        when :'nil' then nil
        when :'true' then true
        when :'false' then false
        else x
      end
    end
  end
  
  # Convert nil, true and false into (), #t and #f for compatability
  # with Scheme
  def convert_scheme_literals(data)
    return recursive_map(data) do |x|
      case x
        when nil then []
        when true then :"#t"
        when false then :"#f"
        else x
      end
     end
  end
  
  # Convert a set of nested arrays back into an S-Expression
  def to_sexp(data)
    data = convert_scheme_literals(data) if(@scheme_compatability)
    if( data.is_a?(Array))
      mapped = data.map do |item|
        if( item.is_a?(Array))
          to_sexp(item)
        else
          item.to_s
        end
      end
      "(" + mapped.join(" ") + ")"
    else
      data.to_s
    end
  end
  
  private
  
    def recursive_map(data, &block)
      if(data.is_a?(Array))
        return data.map do |x|
          if(x.is_a?(Array))
            recursive_map(x, &block)
          else
            block.call(x)
          end
        end
      else
        block.call(data)
      end
    end
  
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
qcmd-0.1.8 lib/vendor/sexpistol/sexpistol/sexpistol.rb
sexpistol-0.0.7 lib/sexpistol/sexpistol.rb