Class: SFRP::Poly::MatchExp

Inherits:
Object
  • Object
show all
Defined in:
lib/sfrp/poly/expression.rb

Defined Under Namespace

Classes: Case

Instance Method Summary collapse

Constructor Details

#initialize(left_exp, cases, id = nil) ⇒ MatchExp

Returns a new instance of MatchExp.



6
7
8
9
10
# File 'lib/sfrp/poly/expression.rb', line 6

def initialize(left_exp, cases, id = nil)
  @left_exp = left_exp
  @cases = cases
  @id = id
end

Instance Method Details

#called_func_strsObject



29
30
31
# File 'lib/sfrp/poly/expression.rb', line 29

def called_func_strs
  [@left_exp, *@cases.map(&:exp)].flat_map(&:called_func_strs)
end

#cloneObject



24
25
26
27
# File 'lib/sfrp/poly/expression.rb', line 24

def clone
  cloned_cases = @cases.map { |c| Case.new(c.pattern.clone, c.exp.clone) }
  MatchExp.new(@left_exp.clone, cloned_cases, @id)
end

#to_mono(monofier) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/sfrp/poly/expression.rb', line 33

def to_mono(monofier)
  raise UndeterminableTypeError.new(@id, @typing) unless @typing.mono?
  mono_type_str = monofier.use_type(@typing)
  M.match_e(mono_type_str, @left_exp.to_mono(monofier)) do |m|
    @cases.each do |c|
      m.case(c.pattern.to_mono(monofier)) { c.exp.to_mono(monofier) }
    end
  end
end

#typing(set, var_env) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/sfrp/poly/expression.rb', line 12

def typing(set, var_env)
  raise if @typing
  left_exp_typing = @left_exp.typing(set, var_env)
  @typing = Typing.new do |t|
    @cases.each do |c|
      new_var_env = var_env.dup
      left_exp_typing.unify(c.pattern.typing(set, new_var_env))
      t.unify(c.exp.typing(set, new_var_env))
    end
  end
end