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