# Nil and variables

## Data, or the lack thereof

Humans have different ways of representing a lack of data. If there are no sheep to count then we have zero sheep. If there are no words on a page then the page is blank. In a computer we may represent the number of sheep as `0` or the missing words on a page as an empty `""`. These are still data though... a number and a string. In software when you want to represent a lack of data we have:

``````nil
``````

Sometimes called `null` or `undefined` data in other languages. It's seemingly useless. You can't use operators on `nil`.

``````nil + nil
``````

This will print an error like it did when you tried doing arithmetic on strings. Let's take a look at variables and we'll discover the purpose of `nil`.

## Variables

Sometimes you want to write out data, but you want that data to be easy to change. Variables let you give data a name to reference. Here's an example to try:

``````name = "Mandy"
"hello my name is " .. name
``````

Since you told it what `name` is, it knows what value to add to the string `"hello my name is "`. If you type:

``````name
``````

...and hit ENTER, it will print out the value that belongs to this variable to remind you. The `=` (equal) sign tells Lua that you want to assign a value to the given name/variable. You can change the value of a variable and get different results:

``````name = "Jeff"
"hello my name is " .. name
``````

Assignment isn't the same as it is in Algebra. You can change the value of a variable multiple times. We can tell `name` that it equals itself with some additional information concatenated to it:

``````name = "abc"
name = name .. "def"
name
``````

You can assign any type of data to a variable, including numbers:

``````name = "Jeff"
age = 16
"hello my name is " .. name .. " and I am " .. age .. "."
``````

You can change numbers after assignment too:

``````age = 16
age = age * 2
"my age doubled is " .. age
``````

So, what if you type in a made up variable name?

``````noname
``````

You will see it has `nil`, or no data yet. If you try to use `nil` in your string operation you will get an error:

``````"hello my name is " .. nil
``````
``````[string "return "hello my name is " .. nil"]:1: attempt to concatenate a nil value
``````
``````"hello my name is " .. noname
``````
``````[string "return "hello my name is " .. noname"]:1: attempt to concatenate global 'noname' (a nil value)
``````

Try assigning a value to a variable name:

``````best_color = "purple"
``````

then assigning that variable data to another:

``````worst_color = best_color
worst_color
``````

You'll see that both variables now have the value `"purple"`.

Variables can have names made up of letters, numbers and underscores (`_`). Variable names cannot begin with a number though, otherwise it will think you're trying to type in number data. Here's some examples of valid variables:

``````my_dog = "Poe"
myDog = "Zia"
DOG3 = "Ember"
``````

## Exercises

• Try out different variable names. Try a few invalid variables names too just to see what the error message looks like. It's important to see error messages and understand them. They help you understand how a program breaks so you can fix it.