doc: add more subheadings & tweaks (#5752)
							parent
							
								
									582338ab79
								
							
						
					
					
						commit
						75aa92b907
					
				
							
								
								
									
										62
									
								
								doc/docs.md
								
								
								
								
							
							
						
						
									
										62
									
								
								doc/docs.md
								
								
								
								
							|  | @ -22,21 +22,24 @@ you can do in V. | ||||||
| * [Hello world](#hello-world) | * [Hello world](#hello-world) | ||||||
| * [Comments](#comments) | * [Comments](#comments) | ||||||
| * [Functions](#functions) | * [Functions](#functions) | ||||||
|  |     * [Returning multiple values](#returning-multiple-values) | ||||||
|  | * [Symbol visibility](#symbol-visibility) | ||||||
| * [Variables](#variables) | * [Variables](#variables) | ||||||
| * [Types](#types) | * [Types](#types) | ||||||
|     * [Primitive types](#primitive-types) |  | ||||||
|     * [Strings](#strings) |     * [Strings](#strings) | ||||||
|     * [Numbers](#numbers) |     * [Numbers](#numbers) | ||||||
|     * [Arrays](#arrays) |     * [Arrays](#arrays) | ||||||
|     * [Maps](#maps) |     * [Maps](#maps) | ||||||
| * [Module Imports](#module-imports) | * [Module imports](#module-imports) | ||||||
| * [Statements & Expressions](#statements--expressions) | * [Statements & expressions](#statements--expressions) | ||||||
|     * [If](#if) |     * [If](#if) | ||||||
|     * [In Operator](#in-operator) |     * [In operator](#in-operator) | ||||||
|     * [For loop](#for-loop) |     * [For loop](#for-loop) | ||||||
|     * [Match](#match) |     * [Match](#match) | ||||||
|     * [Defer](#defer) |     * [Defer](#defer) | ||||||
| * [Structs](#structs) | * [Structs](#structs) | ||||||
|  |     * [Embedded structs](#embedded-structs) | ||||||
|  |     * [Default field values](#default-field-values) | ||||||
|     * [Short struct literal syntax](#short-struct-initialization-syntax) |     * [Short struct literal syntax](#short-struct-initialization-syntax) | ||||||
|     * [Access modifiers](#access-modifiers) |     * [Access modifiers](#access-modifiers) | ||||||
|     * [Methods](#methods) |     * [Methods](#methods) | ||||||
|  | @ -167,7 +170,7 @@ Functions can be used before their declaration: | ||||||
| This is true for all declarations in V and eliminates the need for header files | This is true for all declarations in V and eliminates the need for header files | ||||||
| or thinking about the order of files and declarations. | or thinking about the order of files and declarations. | ||||||
| 
 | 
 | ||||||
| <p> </p> | ### Returning multiple values | ||||||
| 
 | 
 | ||||||
| ```v | ```v | ||||||
| fn foo() (int, int) { | fn foo() (int, int) { | ||||||
|  | @ -180,10 +183,7 @@ println(b) // 3 | ||||||
| c, _ := foo() // ignore values using `_` | c, _ := foo() // ignore values using `_` | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Functions can return multiple values. | ## Symbol visibility | ||||||
| 
 |  | ||||||
| <p> </p> |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| ```v | ```v | ||||||
| pub fn public_function() { | pub fn public_function() { | ||||||
|  | @ -193,12 +193,10 @@ fn private_function() { | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Like constants and types, functions are private (not exported) by default. | Functions are private (not exported) by default. | ||||||
| To allow other modules to use them, prepend `pub`. The same applies | To allow other modules to use them, prepend `pub`. The same applies | ||||||
| to constants and types. | to constants and types. | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ## Variables | ## Variables | ||||||
| 
 | 
 | ||||||
| ```v | ```v | ||||||
|  | @ -220,9 +218,10 @@ the expression `T(v)` converts the value `v` to the | ||||||
| type `T`. | type `T`. | ||||||
| 
 | 
 | ||||||
| Unlike most other languages, V only allows defining variables in functions. | Unlike most other languages, V only allows defining variables in functions. | ||||||
| Global (module level) variables are not allowed. There's no global state in V. | Global (module level) variables are not allowed. There's no global state in V | ||||||
|  | (see [Pure functions by default](#pure-functions-by-default) for details). | ||||||
| 
 | 
 | ||||||
| <p> </p> | ### Mutable variables | ||||||
| 
 | 
 | ||||||
| ```v | ```v | ||||||
| mut age := 20 | mut age := 20 | ||||||
|  | @ -236,11 +235,11 @@ immutable by default. To be able to change the value of the variable, you have t | ||||||
| 
 | 
 | ||||||
| Try compiling the program above after removing `mut` from the first line. | Try compiling the program above after removing `mut` from the first line. | ||||||
| 
 | 
 | ||||||
|  | ### Initialization vs assignment | ||||||
|  | 
 | ||||||
| Note the (important) difference between `:=` and `=` | Note the (important) difference between `:=` and `=` | ||||||
| `:=` is used for declaring and initializing, `=` is used for assigning. | `:=` is used for declaring and initializing, `=` is used for assigning. | ||||||
| 
 | 
 | ||||||
| <p> </p> |  | ||||||
| 
 |  | ||||||
| ```v | ```v | ||||||
| fn main() { | fn main() { | ||||||
|     age = 21 |     age = 21 | ||||||
|  | @ -250,8 +249,6 @@ fn main() { | ||||||
| This code will not compile, because the variable `age` is not declared. | This code will not compile, because the variable `age` is not declared. | ||||||
| All variables need to be declared in V. | All variables need to be declared in V. | ||||||
| 
 | 
 | ||||||
| <p> </p> |  | ||||||
| 
 |  | ||||||
| ```v | ```v | ||||||
| fn main() { | fn main() { | ||||||
|     age := 21 |     age := 21 | ||||||
|  | @ -263,14 +260,13 @@ fn main() { | ||||||
| In development mode the compiler will warn you that you haven't used the variable (you'll get an "unused variable" warning). | In development mode the compiler will warn you that you haven't used the variable (you'll get an "unused variable" warning). | ||||||
| In production mode (enabled by passing the `-prod` flag to v – `v -prod foo.v`) it will not compile at all (like in Go). | In production mode (enabled by passing the `-prod` flag to v – `v -prod foo.v`) it will not compile at all (like in Go). | ||||||
| 
 | 
 | ||||||
| <p> </p> |  | ||||||
| 
 |  | ||||||
| ```v | ```v | ||||||
| fn main() { | fn main() { | ||||||
|     a := 10 |     a := 10 | ||||||
|     if true { |     if true { | ||||||
|         a := 20 |         a := 20 // error: shadowed variable | ||||||
|     } |     } | ||||||
|  |     // warning: unused variable `a` | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | @ -548,11 +544,11 @@ numbers := { | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ## Module Imports | ## Module imports | ||||||
| 
 | 
 | ||||||
| For information about creating a module, see [Modules](#modules) | For information about creating a module, see [Modules](#modules) | ||||||
| 
 | 
 | ||||||
| ### Importing a Module | ### Importing a module | ||||||
| 
 | 
 | ||||||
| Modules can be imported using keyword `import`. | Modules can be imported using keyword `import`. | ||||||
| 
 | 
 | ||||||
|  | @ -574,7 +570,7 @@ import crypto.sha256 { sum } | ||||||
| import time { Time } | import time { Time } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ### Module Import Aliasing | ### Module import aliasing | ||||||
| 
 | 
 | ||||||
| Any imported module name can be aliased using the `as` keyword: | Any imported module name can be aliased using the `as` keyword: | ||||||
| 
 | 
 | ||||||
|  | @ -608,7 +604,7 @@ fn main() { | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ## Statements & Expressions | ## Statements & expressions | ||||||
| 
 | 
 | ||||||
| ### If | ### If | ||||||
| 
 | 
 | ||||||
|  | @ -887,7 +883,7 @@ p = Point{10, 20} | ||||||
| assert p.x == 10 | assert p.x == 10 | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| <p> </p> | ### Heap structs | ||||||
| 
 | 
 | ||||||
| Structs are allocated on the stack. To allocate a struct on the heap | Structs are allocated on the stack. To allocate a struct on the heap | ||||||
| and get a reference to it, use the `&` prefix: | and get a reference to it, use the `&` prefix: | ||||||
|  | @ -898,10 +894,10 @@ p := &Point{10, 10} | ||||||
| println(p.x) | println(p.x) | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| The type of `p` is `&Point`. It's a reference to `Point`. | The type of `p` is `&Point`. It's a [reference](#references) to `Point`. | ||||||
| References are similar to Go pointers and C++ references. | References are similar to Go pointers and C++ references. | ||||||
| 
 | 
 | ||||||
| <p> </p> | ### Embedded structs | ||||||
| 
 | 
 | ||||||
| V doesn't allow subclassing, but it supports embedded structs: | V doesn't allow subclassing, but it supports embedded structs: | ||||||
| 
 | 
 | ||||||
|  | @ -919,7 +915,7 @@ button.set_pos(x, y) | ||||||
| button.widget.set_pos(x,y) | button.widget.set_pos(x,y) | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| <p> </p> | ### Default field values | ||||||
| 
 | 
 | ||||||
| ```v | ```v | ||||||
| struct Foo { | struct Foo { | ||||||
|  | @ -1047,10 +1043,8 @@ user2 := User{age: 20} | ||||||
| println(user2.can_register()) // "true" | println(user2.can_register()) // "true" | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| V doesn't have classes. But you can define methods on types. | V doesn't have classes, but you can define methods on types. | ||||||
| 
 |  | ||||||
| A method is a function with a special receiver argument. | A method is a function with a special receiver argument. | ||||||
| 
 |  | ||||||
| The receiver appears in its own argument list between the `fn` keyword and the method name. | The receiver appears in its own argument list between the `fn` keyword and the method name. | ||||||
| 
 | 
 | ||||||
| In this example, the `can_register` method has a receiver of type `User` named `u`. | In this example, the `can_register` method has a receiver of type `User` named `u`. | ||||||
|  | @ -1062,7 +1056,7 @@ but a short, preferably one letter long, name. | ||||||
| ### Pure functions by default | ### Pure functions by default | ||||||
| 
 | 
 | ||||||
| V functions are pure by default, meaning that their return values are a function of their arguments only, | V functions are pure by default, meaning that their return values are a function of their arguments only, | ||||||
| and their evaluation has no side effects. | and their evaluation has no side effects (besides I/O). | ||||||
| 
 | 
 | ||||||
| This is achieved by a lack of global variables and all function arguments being immutable by default, | This is achieved by a lack of global variables and all function arguments being immutable by default, | ||||||
| even when [references](#references) are passed. | even when [references](#references) are passed. | ||||||
|  | @ -2471,6 +2465,8 @@ See also [Types](#types). | ||||||
| 
 | 
 | ||||||
| ## Appendix II: Operators | ## Appendix II: Operators | ||||||
| 
 | 
 | ||||||
|  | This lists operators for [primitive types](#primitive-types) only. | ||||||
|  | 
 | ||||||
| ```v | ```v | ||||||
| +    sum                    integers, floats, strings | +    sum                    integers, floats, strings | ||||||
| -    difference             integers, floats | -    difference             integers, floats | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue