2022-04-19 02:37:23 +03:00
|
|
|
---
|
2024-10-21 00:46:35 +03:00
|
|
|
language: V
|
2022-04-19 02:37:23 +03:00
|
|
|
filename: vlang.v
|
|
|
|
contributors:
|
|
|
|
- ["Maou Shimazu", "https://github.com/Maou-Shimazu"]
|
|
|
|
---
|
|
|
|
|
|
|
|
V is a statically typed compiled programming language
|
|
|
|
designed for building maintainable software.
|
|
|
|
|
|
|
|
It's similar to Go and its design has also been influenced by
|
|
|
|
Oberon, Rust, Swift, Kotlin, and Python.
|
|
|
|
|
|
|
|
The language promotes writing
|
|
|
|
simple and clear code with minimal abstraction.
|
|
|
|
|
|
|
|
Despite being simple, V gives the developer a lot of power.
|
|
|
|
Anything you can do in other languages, you can do in V.
|
|
|
|
|
|
|
|
```v
|
|
|
|
// Single Line Comment.
|
|
|
|
/*
|
|
|
|
Multi Line Comment
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct User { // Cannot be defined in main, explained later.
|
|
|
|
age int
|
|
|
|
name string
|
|
|
|
pos int = -1 // custom default value
|
|
|
|
}
|
|
|
|
// struct method
|
|
|
|
fn (u User) can_register() bool {
|
|
|
|
return u.age > 16
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Parser {
|
|
|
|
token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// c like enums
|
|
|
|
enum Token {
|
|
|
|
plus
|
|
|
|
minus
|
|
|
|
div
|
|
|
|
mult
|
|
|
|
}
|
|
|
|
|
|
|
|
// 1. functions
|
|
|
|
// language does not use semi colons
|
|
|
|
fn add(x int, y int) int {
|
|
|
|
return x + y
|
|
|
|
}
|
|
|
|
// can return multiple values
|
|
|
|
fn foo() (int, int) {
|
|
|
|
return 2, 3
|
|
|
|
}
|
|
|
|
|
|
|
|
// function visibility
|
|
|
|
pub fn public_function() { // pub can only be used from a named module.
|
|
|
|
}
|
|
|
|
|
|
|
|
fn private_function() {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Main function
|
|
|
|
fn main() {
|
|
|
|
// Anonymous functions can be declared inside other functions:
|
|
|
|
double_fn := fn (n int) int {
|
|
|
|
return n + n
|
|
|
|
}
|
|
|
|
// 2. Variables: they are immutable by default
|
|
|
|
// implicitly typed
|
|
|
|
x := 1
|
|
|
|
// x = 2 // error
|
|
|
|
mut y := 2
|
|
|
|
y = 4
|
|
|
|
name := "John"
|
|
|
|
large_number := i64(9999999999999)
|
|
|
|
println("$x, $y, $name, $large_number") // 1, 4, John, 9999999999999
|
|
|
|
|
|
|
|
// unpacking values from functions.
|
|
|
|
a, b := foo()
|
|
|
|
println("$a, $b") // 2, 3
|
|
|
|
c, _ := foo() // ignore values using `_`
|
|
|
|
println("$c") // 2
|
|
|
|
|
|
|
|
// Numbers
|
|
|
|
u := u16(12)
|
|
|
|
v := 13 + u // v is of type `u16`
|
|
|
|
r := f32(45.6)
|
|
|
|
q := r + 3.14 // x is of type `f32`
|
|
|
|
s := 75 // a is of type `int`
|
|
|
|
l := 14.7 // b is of type `f64`
|
|
|
|
e := u + s // c is of type `int`
|
|
|
|
d := l + r // d is of type `f64`
|
|
|
|
|
|
|
|
// Strings
|
|
|
|
mut bob := 'Bob'
|
|
|
|
assert bob[0] == u8(66) // indexing gives a byte, u8(66) == `B`
|
|
|
|
assert bob[1..3] == 'ob' // slicing gives a string 'ob'
|
|
|
|
bobby := bob + 'by' // + is used to concatenate strings
|
|
|
|
println(bobby) // "Bobby"
|
|
|
|
bob += "by2" // += is used to append to strings
|
|
|
|
println(bob) // "Bobby2"
|
|
|
|
|
|
|
|
//String values are immutable. You cannot mutate elements:
|
|
|
|
//mut s := 'hello 🌎'
|
|
|
|
//s[0] = `H` // not allowed
|
|
|
|
|
|
|
|
//For raw strings, prepend r. Escape handling is not done for raw strings:
|
|
|
|
rstring := r'hello\nworld' // the `\n` will be preserved as two characters
|
|
|
|
println(rstring) // "hello\nworld"
|
|
|
|
|
|
|
|
// string interpolation
|
|
|
|
println('Hello, $bob!') // Hello, Bob!
|
|
|
|
println('Bob length + 10: ${bob.len + 10}!') // Bob length + 10: 13!
|
|
|
|
|
|
|
|
// 3. Arrays
|
|
|
|
mut numbers := [1, 2, 3]
|
|
|
|
println(numbers) // `[1, 2, 3]`
|
|
|
|
numbers << 4 // append elements with <<
|
|
|
|
println(numbers[3]) // `4`
|
|
|
|
numbers[1] = 5
|
|
|
|
println(numbers) // `[1, 5, 3]`
|
|
|
|
// numbers << "John" // error: `numbers` is an array of numbers
|
|
|
|
numbers = [] // array is now empty
|
|
|
|
arr := []int{len: 5, init: -1}
|
|
|
|
// `arr == [-1, -1, -1, -1, -1]`, arr.cap == 5
|
|
|
|
|
|
|
|
number_slices := [0, 10, 20, 30, 40]
|
|
|
|
println(number_slices[1..4]) // [10, 20, 30]
|
|
|
|
println(number_slices[..4]) // [0, 10, 20, 30]
|
|
|
|
println(number_slices[1..]) // [10, 20, 30, 40]
|
|
|
|
|
|
|
|
// 4. structs and enums
|
|
|
|
// struct User {
|
|
|
|
// age int
|
|
|
|
// name string
|
|
|
|
// pos int = -1 // custom default value
|
|
|
|
// }
|
|
|
|
mut users := User{21, 'Bob', 0}
|
|
|
|
println(users.age) // 21
|
|
|
|
|
|
|
|
// enum Token {
|
|
|
|
// plus
|
|
|
|
// minus
|
|
|
|
// div
|
|
|
|
// mult
|
|
|
|
// }
|
|
|
|
|
|
|
|
// struct Parser {
|
|
|
|
// token Token
|
|
|
|
// }
|
|
|
|
parser := Parser{}
|
|
|
|
if parser.token == .plus || parser.token == .minus
|
|
|
|
|| parser.token == .div || parser.token == .mult {
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 5. Maps
|
|
|
|
number_map := {
|
|
|
|
'one': 1
|
|
|
|
'two': 2
|
|
|
|
}
|
|
|
|
println(number_map) // {'one': 1, 'two': 2}
|
|
|
|
println(number_map["one"]) // 1
|
|
|
|
mut m := map[string]int{} // a map with `string` keys and `int` values
|
|
|
|
m['one'] = 1
|
|
|
|
m['two'] = 2
|
|
|
|
println(m['one']) // "1"
|
|
|
|
println(m['bad_key']) // "0"
|
|
|
|
m.delete('two')
|
|
|
|
|
|
|
|
// 6. Conditionals
|
|
|
|
a_number := 10
|
|
|
|
b_number := 20
|
|
|
|
if a_number < b {
|
|
|
|
println('$a_number < $b_number')
|
|
|
|
} else if a_number > b {
|
|
|
|
println('$a_number > $b_number')
|
|
|
|
} else {
|
|
|
|
println('$a_number == $b_number')
|
|
|
|
}
|
|
|
|
num := 777
|
|
|
|
even_odd := if num % 2 == 0 { 'even' } else { 'odd' }
|
|
|
|
println(even_odd)
|
|
|
|
|
|
|
|
match even_odd {
|
|
|
|
'even' { println('even') }
|
|
|
|
'odd' { println('odd') }
|
|
|
|
else { println('unknown') }
|
|
|
|
}
|
|
|
|
|
|
|
|
// 7. Loops
|
|
|
|
loops := [1, 2, 3, 4, 5]
|
|
|
|
for lp in loops {
|
|
|
|
println(lp)
|
|
|
|
}
|
|
|
|
loop_names := ['Sam', 'Peter']
|
|
|
|
for i, lname in loop_names {
|
|
|
|
println('$i) $lname')
|
|
|
|
// Output: 0) Sam
|
|
|
|
// 1) Peter
|
|
|
|
}
|
|
|
|
// You can also use break and continue followed by a
|
|
|
|
// label name to refer to an outer for loop:
|
|
|
|
outer: for i := 4; true; i++ {
|
|
|
|
println(i)
|
|
|
|
for {
|
|
|
|
if i < 7 {
|
|
|
|
continue outer
|
|
|
|
} else {
|
|
|
|
break outer
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
2024-04-06 18:33:50 +03:00
|
|
|
|
2022-04-19 02:37:23 +03:00
|
|
|
## Further reading
|
|
|
|
|
|
|
|
There are more complex concepts to be learnt in V which are available at the
|
|
|
|
official [V documentation](https://github.com/vlang/v/blob/master/doc/docs.md).
|
|
|
|
|
|
|
|
You can also find more information about the V language at the [official website](https://vlang.io/)
|
2024-04-21 08:11:54 +03:00
|
|
|
or check it out at the [v playground](https://v-wasm.vercel.app/).
|