Sha256: a330b91bb1e4205cc71769578185462170aa42702159e47c472b36e98af46111

Contents?: true

Size: 1.15 KB

Versions: 9

Compression:

Stored size: 1.15 KB

Contents

# encoding: utf-8

class Rouge::Var
  @@stack = []

  def initialize(ns, name, root=Rouge::Var::UnboundSentinel)
    @ns = ns
    @name = name
    raise ArgumentError, "bad var ns" unless ns.is_a? Symbol
    raise ArgumentError, "bad var name" unless name.is_a? Symbol
    if root == Rouge::Var::UnboundSentinel
      @root = Rouge::Var::Unbound.new self
    else
      @root = root
    end
  end

  def ==(var)
    var.is_a?(Rouge::Var) and @ns == var.ns and @name == var.name
  end

  attr_reader :ns, :name
  
  def deref
    @@stack.reverse_each do |map|
      if map.include? @name
        return map[@name]
      end
    end

    @root
  end

  def inspect
    "Rouge::Var.new(#{@ns.inspect}, #{@name.inspect}, #{@root.inspect})"
  end

  def to_s
    inspect
  end

  def self.push(map)
    @@stack << map
  end

  def self.pop
    @@stack.pop
  end
end

Rouge::Var::UnboundSentinel = Object.new
class << Rouge::Var::UnboundSentinel
  def inspect; "#<Rouge::Var::UnboundSentinel>"; end
  def to_s; inspect; end
end

class Rouge::Var::Unbound
  def initialize(var)
    @var = var
  end

  def ==(ub)
    @var == ub.var
  end

  attr_reader :var
end

# vim: set sw=2 et cc=80:

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
rouge-lang-0.0.9 lib/rouge/var.rb
rouge-lang-0.0.8 lib/rouge/var.rb
rouge-lang-0.0.7 lib/rouge/var.rb
rouge-lang-0.0.6 lib/rouge/var.rb
rouge-lang-0.0.5 lib/rouge/var.rb
rouge-lang-0.0.4 lib/rouge/var.rb
rouge-lang-0.0.3 lib/rouge/var.rb
rouge-lang-0.0.2 lib/rouge/var.rb
rouge-lang-0.0.1 lib/rouge/var.rb