1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module Environment
9
10 module Context
11
12 module Value
13
14 class Abstract < Abstraction::Collection
15 def each
16 context = self
17 until context.kind_of?(Initial)
18
19 yield context
20
21 context = context.old_context
22 end
23
24 nil
25 end
26
27
28 def get_bindings
29 {}.freeze
30 end
31
32
33 def lookup(sym, loc, env)
34 ASSERT.kind_of sym, ::Symbol
35 ASSERT.kind_of loc, LOC::Entry
36 ASSERT.kind_of env, E::Entry
37
38 self.each do |context|
39 ASSERT.kind_of context, Entry
40
41 target = context.bindings[sym]
42 ASSERT.opt_kind_of target, Target::Abstract
43
44 if target
45 got_value = target.get_value(context)
46 ASSERT.kind_of got_value, VC::Top
47
48 return got_value
49 end
50 end
51
52 raise X::NameError.new(
53 loc,
54 env,
55 "Unbound value identifier: '%s'", sym.to_s
56 )
57 end
58
59
60 def extend(sym, target)
61 ASSERT.kind_of sym, ::Symbol
62 ASSERT.kind_of target, Target::Abstract
63
64 pair = __extend__ sym, target
65 ASSERT.tuple_of pair, [::Hash, Abstract]
66
67 ECV.make_bindings(*pair)
68 end
69
70
71 def extend_bindings(bindings)
72 ASSERT.kind_of bindings, ::Hash
73
74 ECV.make_bindings bindings, self
75 end
76
77
78 private
79
80 def __extend__(_sym, _target)
81 raise X::InternalSubclassResponsibility
82 end
83 end
84
85 end # Umu::Environment::Context::Value
86
87 end # Umu::Environment::Context
88
89 end # Umu::Environment
90
91 end # Umu