Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit39a4bd3d1b70e4d800487b79860f9113fb079f84 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-12-05 12:09:14 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-12-05 12:09:14 +0200
Files8251e9818bb5ca7199ca4b4450afde6fbd29704a
uni-projects-39a4bd3d1b70e4d800487b79860f9113fb079f84.tar
uni-projects-39a4bd3d1b70e4d800487b79860f9113fb079f84.tar.gz
uni-projects-39a4bd3d1b70e4d800487b79860f9113fb079f84.zip
Parenta607349b22f8a201512582e6341fe020527baf62 (diff)
[CI/H5] Solved homework
1 files changed, 63 insertions, 0 deletions
-rw-r--r--Year 3/Compilers, Introduction/Homework05.txt63
diff --git a/Year 3/Compilers, Introduction/Homework05.txt b/Year 3/Compilers, Introduction/Homework05.txt
new file mode 100644
index 0000000..61efb38
--- /dev/null
+++ b/Year 3/Compilers, Introduction/Homework05.txt
@@ -0,0 +1,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()"