Sha256: d9ada2cc88450742232d2ab9581c8582df24c1a141e207b79ff1d9917e1eb44a

Contents?: true

Size: 913 Bytes

Versions: 1

Compression:

Stored size: 913 Bytes

Contents

class Scope
  def initialize(parent = {})
    @parent = parent
    @symbols = {}
  end

  def [](name)
    @symbols[name] || @parent[name]
  end

  def []=(name, value)
    @symbols[name] = value
  end

  def merge(scope)
    @symbols.merge!(scope)
  end

  def override_scope(scope)
    scope.merge!(@symbols)
    @symbols = scope
  end

  def retrieve_scope
    @symbols
  end

  def define(name, &block) 
    self[name] =  Function.new(&block)    
  end

  def syntax(name, &block) 
    self[name] =  Syntax.new(&block)    
  end

end

class TopLevel < Scope
  def initialize
    super

    syntax('set') do |scope, cells|
      scope[cells.first.text_value] = cells[1].eval(scope)
    end

    define('+') {|a,b| a + b }
    define('-') {|a,b| a - b }
    define('*') {|a,b| a * b }
    define('/') {|a,b| a / b }
    define('=') {|a,b| a == b }
    define('sum') {|*args| args.flatten.reduce(:+) }
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
expressive-0.0.1 lib/scope.rb