From 8becd000a2164920e0dd1e21571d34c029d2436d Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Tue, 23 Jan 2024 18:45:26 -0300 Subject: [PATCH] Type implemented --- 16_interfaces/dynamic_casts.v | 34 +++++++++++++++++++++++ 16_interfaces/embedded_interface.v | 29 ++++++++++++++++++++ 16_interfaces/interface_example5.v | 34 +++++++++++++++++++++++ 16_interfaces/interface_example6.v | 24 ++++++++++++++++ 16_interfaces/matching_sum.v | 44 ++++++++++++++++++++++++++++++ 5 files changed, 165 insertions(+) create mode 100644 16_interfaces/dynamic_casts.v create mode 100644 16_interfaces/embedded_interface.v create mode 100644 16_interfaces/interface_example5.v create mode 100644 16_interfaces/interface_example6.v create mode 100644 16_interfaces/matching_sum.v diff --git a/16_interfaces/dynamic_casts.v b/16_interfaces/dynamic_casts.v new file mode 100644 index 0000000..d03c1b6 --- /dev/null +++ b/16_interfaces/dynamic_casts.v @@ -0,0 +1,34 @@ +struct Moon{} + +struct Mars{} + +struct Venus{} + +type World = Mars | Moon | Venus + +fn (m Mars) dust_storm() bool { + return true +} + +fn main(){ + mut w := World(Moon{}) + + assert w is Moon + w = Mars{} + + mars := w as Mars + + if mars.dust_storm(){ + println('bad weather!') + } + + //w1 := World(Mars{}) + + if mut w is Mars{ + assert typeof(w).name == typeof(Mars{}).name + + if w.dust_storm(){ + println('bad weather!') + } + } +} \ No newline at end of file diff --git a/16_interfaces/embedded_interface.v b/16_interfaces/embedded_interface.v new file mode 100644 index 0000000..7d26426 --- /dev/null +++ b/16_interfaces/embedded_interface.v @@ -0,0 +1,29 @@ +pub interface Reader{ +mut: + read(mut buf []u8) ?int +} + +pub interface Write{ +mut: + write(buf []u8) ?int +} + +pub interface ReaderWriter{ + Reader + Write +} + + +struct Moon{} +struct Mars{} +struct Venus{} + +type World = Mars | Moon | Venus + +fn main(){ + + sum := World(Moon{}) + assert sum.type_name() == 'Moon' + println(sum) + +} \ No newline at end of file diff --git a/16_interfaces/interface_example5.v b/16_interfaces/interface_example5.v new file mode 100644 index 0000000..49776bb --- /dev/null +++ b/16_interfaces/interface_example5.v @@ -0,0 +1,34 @@ +interface Adoptable{} + +fn (a Adoptable) speak() string { + return 'adopt me!' +} + +struct Cat{} + +fn (c Cat) speak() string{ + return 'meow!' +} + +struct Dog{} + +fn main(){ + cat := Cat{} + + assert dump(cat.speak()) == 'meow!' + + a := Adoptable(cat) + + assert dump(a.speak()) == 'adopt me!' + + if a is Cat{ + dump(a.speak()) + } + + b := Adoptable(Dog{}) + assert dump(b.speak()) == 'adopt me!' + + //if b is Dog{ + // dump(b.speak()) + //} +} \ No newline at end of file diff --git a/16_interfaces/interface_example6.v b/16_interfaces/interface_example6.v new file mode 100644 index 0000000..0c5c795 --- /dev/null +++ b/16_interfaces/interface_example6.v @@ -0,0 +1,24 @@ +struct Empty{} + +struct Node{ + value f64 + left Tree + right Tree +} + +type Tree = Empty | Node + +fn sum(tree Tree) f64{ + return match tree { + Empty { 0 } + Node { tree.value + sum(tree.left) + sum(tree.right)} + } +} + +fn main(){ + left := Node{0.2,Empty{}, Empty{}} + right := Node{0.3, Empty{}, Node{0.4, Empty{},Empty{},}} + tree := Node{0.5, left, right} + + println(sum(tree)) +} \ No newline at end of file diff --git a/16_interfaces/matching_sum.v b/16_interfaces/matching_sum.v new file mode 100644 index 0000000..3e6faea --- /dev/null +++ b/16_interfaces/matching_sum.v @@ -0,0 +1,44 @@ +struct Moon{} + +struct Mars{} + +struct Venus{} + +type World = Mars | Moon | Venus + +fn open_parachutes(n int){ + println(n) +} + +fn land(w World){ + match w { + Moon{} + Mars{ + open_parachutes(3) + } + Venus{ + open_parachutes(1) + } + } +} + + +fn (m Moon) moon_walk(){} +fn(m Mars) shiver(){} +fn(v Venus) sweat(){} + +fn pass_time(w World){ + match w{ + Moon { w.moon_walk() } + Mars { w.shiver() } + else {} + } +} + +fn main(){ + + mut world := World(Mars{}) + + land(world) + pass_time(world) +} \ No newline at end of file