diff --git a/docs/language/glossary.md b/docs/language/glossary.md new file mode 100644 index 0000000000..085f8a94c9 --- /dev/null +++ b/docs/language/glossary.md @@ -0,0 +1,314 @@ +--- +title: Glossary of Symbols and Operators +--- + +A simple glossary containing Cadence's symbols and operators and their use (sorted in phonetical alphabetical order). Links to the relevant reference documentation are also provided. + +Tip: CTRL/ + F and type in the symbol or operator you want to look up. + +## & (ampersand) + +The & (ampersand) symbol has several uses. + +### Reference + +The more Cadence-specific use is that of a Reference. In Cadence it is possible to create references to objects, i.e. resources or structures. A reference can be used to access fields and call functions on the referenced object. + +References are created by using the & operator, followed by the object, the as keyword, and the type through which they should be accessed. The given type must be a supertype of the referenced object's type. [More info](https://docs.onflow.org/cadence/language/references/) + +```cadence +let a: String = "hello" +let refOfA: &String = &a as &String +``` + +References may also be authorized if the `&` symbol is preceded by `auth` (otherwise the reference is unauthorized) + +Authorized references have the auth modifier, i.e. the full syntax is `auth &T`, whereas unauthorized references do not have a modifier. Lastly, references are ephemeral, i.e they cannot be stored. [More info](https://docs.onflow.org/cadence/language/references/) + +```cadence +let a: String = "hello" +let refOfA: &String = &a as auth &String +``` + +### Logical Operator + +It can be also used as a logical operator (AND), by appearing twice in succession (i.e. `&&`), similar to the double pipe symbol (`||`, which represents OR): + +```cadence +let a = true +let b = false + +let c = a && b // false +``` + +## @ (at) + +The `@` symbol before a Type declaration is used to annotate whether a specific type is a [resource](https://docs.onflow.org/cadence/language/resources/). Resources must therefore adhere to the resource-specific lifecycle in Cadence (create, destroy, move). [More info](https://docs.onflow.org/cadence/language/resources/) + +```cadence +// Declare a resource named `SomeResource` +pub resource SomeResource { + pub var value: Int + + init(value: Int) { + self.value = value + } +} + +// we use the '@' symbol to reference a resource type +let a: @SomeResource <- create SomeResource(value: 0) + +// also in functions declarations +pub fun use(resource: @SomeResource) { + destroy resource +} +``` + +## : (colon) + +### Type Declaration +If a colon follows a variable/constant/function declaration, it is used to declare its type. + +```cadence +let a: Bool = true; // assigns a value to a + +// or + +fun addOne(x: Int): Int { // return type of Int + return x + 1 +} +``` + +### Ternary Operator + +It can also be used in ternary operations to represent the "otherwise" section, such as the following: + +```cadence +let a = 1 > 2 ? 3 : 4 +// should be read as: +// "is 1 greater than 2?" +// "if YES, then set a = 3, +// "if NO, then set a = 4. +``` + +## = (equals) + +A simple assignment + +```cadence +let a = 1; // assigns a value to a +``` + +## ! (exclamation mark) + +The exclamation mark has a different effect whether it precedes or succeeds a variable. + +When it immediately **precedes** a boolean-type variable, it negates it. + +```cadence +let a: Bool = true; +let b: Bool = !a; + +// b is false +``` + +When it immediately **succeeds** an *optional* variable, it force-unwraps it. Force-unwrapping returns the value inside an optional if it contains a value, or panics and aborts the execution if the optional has no value, i.e., the optional value is nil. [More info](https://docs.onflow.org/cadence/language/values-and-types/#force-unwrap-) + +```cadence +let a: Int? = nil; +let b: Int? = 3; + +let c: Int = a! // panics, because = nil +let d: Int = b! // initialized correctly as 3 +``` + +## / (forward slash) + +The / (forward slash) symbol can be used in two ways: either as a division operator or as a path separator. + +### Division Operator +As a division operator `let a = 1/2` + +```cadence +let a: Fix64= 2.0 +let b: Fix64= 3.0 +let c = a / b // = 0.66666666 +``` +[More info](https://docs.onflow.org/cadence/language/values-and-types/#fixed-point-numbers) on division and Fixed point numbers in Cadence. + +### Path separator + +In a [Path](https://docs.onflow.org/cadence/language/accounts/#paths), the forward slash separates domain (e.g. `storage`, `private`, `public`) and identifiers (much like in a traditional file store). [More info](https://docs.onflow.org/cadence/language/accounts/#paths) + +```cadence +let storagePath = /storage/path +storagePath.toString() // is "/storage/path" +``` + +[More info](https://docs.onflow.org/cadence/language/accounts/#paths) on Paths + +## <- (lower than, hyphen) (Move operator) + +The move operator `<-` replaces the assignment operator `=` in assignments that involve resources. To make assignment of resources explicit, the move operator `<-` must be used when: + +- the resource is the initial value of a constant or variable, +- the resource is moved to a different variable in an assignment, +- the resource is moved to a function as an argument +- the resource is returned from a function. + +This is because resources in Cadence are linear types meaning they can only exist in a single place at a time. So the move operator figuratively helps underline that that resource is being moved and will no longer be available in its previous location/state once it is moved. + +[More info](https://docs.onflow.org/cadence/language/resources/#the-move-operator--) + +```cadence +resource R {} + +let a <- create R() // we instantiate a new resource and move it into a +``` + +Keep in mind that any time resources are involved, the move (or swap) operator must be used, including in Arrays and Dictionaries! [More info](https://docs.onflow.org/cadence/language/resources/#resources-in-arrays-and-dictionaries) + +```cadence +resource R {} + +let a <- [ + <- create R(), // we create a new resource R and move it into the Array + <- create R() // another time +] +``` + +## <-! (lower than, hyphen, exclamation mark) (Force-assignment move operator) + +Assigns a resource value to an optional variable if the variable is `nil` (if it is not nil, it aborts) + +This is only used for resources, as they use the move operator. [More info](https://docs.onflow.org/cadence/language/values-and-types/#force-assignment-operator--) + +```cadence +pub resource R {} + +var a: @R? <- nil +a <-! create R() +``` + +## <-> (lower than, hyphen, greater than) (Swap operator) + +`<->` is referred to as the Swap operator. It swaps values between the variables to the left and right of it. [More info](https://docs.onflow.org/cadence/language/operators/#swapping) + +```cadence +let a = 1; +let b = 2; + +a <-> b; +// a = 2 +// b = 1 +``` + +## + (plus), - (minus), * (asterisk), % (percentage sign) + +These are all typical arithmetic operators. + +- Addition: + +- Subtraction: - +- Multiplication: * +- Remainder: % + +[More info](https://docs.onflow.org/cadence/language/operators/#arithmetic) + +## ? (question mark) + +The ? (question mark) symbol has several uses. If a ? follows a variable/constant, it represents an optional. An optional can either have a value or *nothing at all*. + +```cadence +// Declare a constant which has an optional integer type +// +let a: Int? = nil +``` + +When you see as?, that's a conditional downcasting operator. It can be used to downcast a value to a type. This operator returns an optional, and if the value has a type that is a subtype it will return the value as that type, otherwise it will return `nil`. [More info](https://docs.onflow.org/cadence/language/values-and-types/#conditional-downcasting-operator) + +```cadence +// a simple interface that expects a property count +resource interface HasCount { + count : Int +} + +// a Counter resource that conforms to HasCount +resource Counter: HasCount { + pub var count: Int + + pub init(count: Int) { + self.count = count + } +} + +// set a reference countRef to &counter with the hasCount interface +// this is important because ONLY methods in HasCount will be available! +let countRef: &{HasCount} = &counter as &{HasCount} + +// BUT, we could also optionally downcast it to Counter +let authCountRef: auth &{HasCount} = &counter as auth &{HasCount} +let countRef2: &Counter = authCountRef as? &Counter +``` + +It is a big topic, so best to [read the documentation on it](https://docs.onflow.org/cadence/language/values-and-types/#optionals) + + +It can also be used in ternary operations to represent the "otherwise" section, such as the following: + + +```cadence +let a = 1 > 2 ? 3 : 4 +// should be read as: +// "is 1 greater than 2?" +// "if YES, then set a = 3, +// "if NO, then set a = 4. +``` + +It can also be used as a nil-coalescing operator. The nil-coalescing operator `??` returns the value inside an optional if it contains a value, or returns an alternative value if the optional has no value, i.e., the optional value is nil. The nil-coalescing operator can only be applied to values which have an optional type. [More info](https://docs.onflow.org/cadence/language/values-and-types/#nil-coalescing-operator) + +```cadence +// Declare a constant which has an optional integer type +// +let a: Int? = nil + +// Declare a constant with a non-optional integer type, +// which is initialized to `a` if it is non-nil, or 42 otherwise. +// +let b: Int = a ?? 42 +// `b` is 42, as `a` is nil + + +// Invalid: nil-coalescing operator is applied to a value which has a non-optional type +// (the integer literal is of type `Int`). +// +let c = 1 ?? 2 +``` + +## _ (underscore) + +The `_` (underscore) symbol has several uses. + +It can be used in variable names, or to split up numerical components. + +Examples: + +```cadence +let _a = true; // used as a variable name + +// or + +let b = 100_000_000 // used to split up a number (supports all number types, e.g. 0b10_11_01) +``` + +It can also be used to omit the function argument label. Usually argument labels precede the parameter name. The special argument label _ indicates that a function call can omit the argument label. [More info](https://docs.onflow.org/cadence/language/functions/#function-declarations) + +```cadence +// The special argument label _ is specified for the parameter, +// so no argument label has to be provided in a function call. + +fun double(_ x: Int): Int { + return x * 2 +} +``` + +