From 60717ed15de4693875b7a474a5b0713b45b5eb78 Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Tue, 23 Jan 2024 11:29:45 -0300 Subject: [PATCH 1/5] More interface examples --- 16_interfaces/casting.v | 10 ++++----- 16_interfaces/interface_example4.v | 36 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 16_interfaces/interface_example4.v diff --git a/16_interfaces/casting.v b/16_interfaces/casting.v index 7b4c443..79398f1 100644 --- a/16_interfaces/casting.v +++ b/16_interfaces/casting.v @@ -2,21 +2,19 @@ struct Dog{ breed string - speak() string } -fn (d Dog) speak() string { - println('Woof') +fn (d Dog) speak() string{ + return 'Woof' } struct Cat{ breed string - speak() string } fn (c Cat) speak() string{ - println('Meow') + return 'Meow' } interface Something{} @@ -24,7 +22,7 @@ interface Something{} fn announce(s Something){ if s is Dog { - println('a ${s.breed] dog') + println('a ${s.breed} dog') }else if s is Cat{ println('a cat speaks ${s.speak()}') }else { diff --git a/16_interfaces/interface_example4.v b/16_interfaces/interface_example4.v new file mode 100644 index 0000000..91b71e1 --- /dev/null +++ b/16_interfaces/interface_example4.v @@ -0,0 +1,36 @@ +interface IFoo{ + foo() +} + +interface IBar{ + bar() +} + +struct SFoo{} + +fn (sf SFoo) foo() {} + + +struct SFooBar {} + +fn (sfb SFooBar) foo() {} + + +fn (sfb SFooBar) bar() { + dump('This implements IBar') +} + +fn main(){ + + mut arr := []IFoo{} + arr << SFoo{} + arr << SFooBar{} + + for a in arr{ + dump(a) + + if a is IBar{ + a.bar() + } + } +} \ No newline at end of file From 8becd000a2164920e0dd1e21571d34c029d2436d Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Tue, 23 Jan 2024 18:45:26 -0300 Subject: [PATCH 2/5] 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 From 1a3c96a3941e366f6b320e08aaad91c2f1d14fa9 Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Tue, 23 Jan 2024 18:51:40 -0300 Subject: [PATCH 3/5] V documentation url add --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6cf551b..9b4aa50 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ ### Codes of my learning process in V Programming Language + +(V Documentation)[https://github.com/vlang/v/blob/master/doc/docs.md#interfaces] \ No newline at end of file From 738a7a4b00e2e74d3ad307febb094de1493bdc36 Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Tue, 23 Jan 2024 18:52:52 -0300 Subject: [PATCH 4/5] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b4aa50..ec89698 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ ### Codes of my learning process in V Programming Language -(V Documentation)[https://github.com/vlang/v/blob/master/doc/docs.md#interfaces] \ No newline at end of file +(V Documentation)[https://github.com/vlang/v/blob/master/doc/docs.md] \ No newline at end of file From daf26d4e9c23b1ab2b83205786d5135366fe225f Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Tue, 23 Jan 2024 18:54:05 -0300 Subject: [PATCH 5/5] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec89698..9345695 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ ### Codes of my learning process in V Programming Language -(V Documentation)[https://github.com/vlang/v/blob/master/doc/docs.md] \ No newline at end of file +[V Documentation](https://github.com/vlang/v/blob/master/doc/docs.md) \ No newline at end of file