1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# 1 зад
Foo < Bar < Baz < Object
case 3 of
y: Int => y;
z: Bool => z;
esac;
lub(Int, Bool) = Object
if 0 = 1 then new Bar else new Foo fi;
lib(Bar, Foo) = Bar
Връща Bar, понеже Foo < Bar
let x: Bazz ← new Bar in x;
Bazz
# 2 зад
Статична видимост, следователно
foo(z) <-> 5 + z
bar(y) <-> 5 + y
foo(bar(3)) <-> foo(8) <-> 13
# 3 зад
x = 7
\ foo(bar(3))
|
x = 1, z = 2
\ foo(3)
|
z = 3
\ x + z <-> 1 + 3 <-> 4
\ foo(4)
|
z = 4
\ x + z <-> 7 + 4 <-> 11
# 4 зад
21 bar(): (*MISSING*) {
22 case foo() of
23 f: Foo => f@Foo.foo();
24 b: Bar => (new Bazz).foo();
25 o: Object => foo();
26 esac
27 };
lub(f@Foo.foo(), (new Bazz).foo(), foo())
f: Foo => SELF_TYPE = Foo, Foo.foo: Foo
Bazz.foo, SELF_TYPE = Bazz => Baz.foo: Bazz
(new Bar).foo => SELF_TYPE = Bar, foo: Bar
Bazz < Bar < Foo < IO < Object
lub(Foo, Bazz, Bar) \in { Foo, IO, Object } => a., d., e. са верни
# 5 зад
main -> (new Bar).bar() -> case foo() of ... -> foo() -> print "Bar.foo()"; return new Bar;
case new Bar of
...
b: Bar => (new Bazz).foo() -> pinrt "Bazz.foo()"; (new Bar)@Foo.foo(); -> Foo.foo() -> print "Foo.foo()"; foo() -> Bar.foo() -> print "Bar.foo()"
|