1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module Value
9
10 module Core
11
12 class Ref < Object
13 define_class_method(
14 :meth_make_ref,
15 :make, [],
16 [VC::Top], self
17 )
18 def self.meth_make_ref(loc, env, _event, val)
19 VC.make_reference val
20 end
21
22
23 attr_reader :mutable_val
24
25 def initialize(val)
26 ASSERT.kind_of val, VC::Top
27
28 super()
29
30 @mutable_val = val
31 end
32
33
34 def to_s
35 format "#Ref<%s>", self.mutable_val.to_s
36 end
37
38
39 def pretty_print(q)
40 PRT.group q, bb:'#Ref<', eb:'>' do
41 q.pp self.mutable_val
42 end
43 end
44
45
46 define_instance_method(
47 :meth_peek,
48 :'peek!', [],
49 [], VC::Top
50 )
51 def meth_peek(loc, env, _event)
52 self.mutable_val
53 end
54
55
56 define_instance_method(
57 :meth_poke,
58 :'poke!', [],
59 [VC::Top], VC::Unit
60 )
61 def meth_poke(_loc, _env, _event, val)
62 ASSERT.kind_of val, VC::Top
63
64 @mutable_val = val
65
66 VC.make_unit
67 end
68 end
69 Ref.freeze
70
71
72 module_function
73
74 def make_reference(val)
75 ASSERT.kind_of val, VC::Top
76
77 Ref.new(val) # Does NOT freeze!!
78 end
79
80 end # Umu::Value::Core
81
82 end # Umu::Value
83
84 end # Umu