class SFRP::Mono::MatchExp

Constants

Case

Public Class Methods

new(type_str, left_exp, cases, id = nil) click to toggle source
# File lib/sfrp/mono/expression.rb, line 14
def initialize(type_str, left_exp, cases, id = nil)
  @type_str = type_str
  @left_exp = left_exp
  @cases = cases
  @id = id
end

Public Instance Methods

check_completeness(set) click to toggle source
# File lib/sfrp/mono/expression.rb, line 42
def check_completeness(set)
  set.type(@left_exp.type_str).all_pattern_examples(set).each do |exam|
    unless @cases.any? { |c| c.pattern.accept?(exam) }
      raise IncompleteMatchExpError.new
    end
  end
end
comp() click to toggle source
# File lib/sfrp/mono/expression.rb, line 21
def comp
  [@type_str, @left_exp, @cases]
end
memory(set) click to toggle source
# File lib/sfrp/mono/expression.rb, line 50
def memory(set)
  m = @cases.map { |c| c.exp.memory(set) }.reduce { |a, b| a.or(b) }
  @left_exp.memory(set).and(m)
end
to_low(set, env) click to toggle source

Note that the expression this returns is not wrapped by ().

# File lib/sfrp/mono/expression.rb, line 26
def to_low(set, env)
  check_completeness(set)
  tmp_var_str = env.new_var(@left_exp.type_str)
  left_let_exp = "#{tmp_var_str} = #{@left_exp.to_low(set, env)}"
  case_exp = L.if_chain_exp do |i|
    @cases.each do |c|
      cond_exps = c.pattern.low_cond_exps(set, tmp_var_str)
      let_exps = c.pattern.low_let_exps(set, tmp_var_str, env)
      exp = (let_exps + [c.exp.to_low(set, env)]).join(', ')
      i.finish(exp) if cond_exps.empty?
      i.append_case(cond_exps.join(' && '), exp)
    end
  end
  "#{left_let_exp}, #{case_exp}"
end