# Waar kan ik mijn variabele gebruiken? [Syntaxis en waarden](LEESMIJ.md) Een variabele heeft een naam en een gebied waarin je die naam kunt gebruiken. Dat gebied heet het **bereik**. Denk aan een kleine doos in een grotere doos: code zoekt namen eerst in de eigen doos en daarna in de omringende dozen. De kleine doos is een **binnenste bereik**. Pliro gebruikt **lexicaal bereik**: de plaats in je geschreven code bepaalt welke dozen om elkaar zitten. Een functie ergens anders aanroepen verandert haar buitenste bereik niet. **Lokale** namen horen bij een blok of functie. **Globale** namen staan op programmaniveau, buiten die blokken. Een **declaratie** maakt een naam. Pliro maakt die vanaf die plek beschikbaar. Sommige talen laten je latere declaraties al eerder gebruiken; dat heet **hoisting**. Pliro doet dat niet. Een functie mag zichzelf aanroepen: [recursie](recursie.md). Bij **wederzijdse recursie** roepen twee functies elkaar aan; daarvoor een latere functiedeclaratie gebruiken wordt niet ondersteund. Ingebouwde namen, soms **preludenamen** genoemd, zijn al beschikbaar vóór je eigen declaraties. ## Probeer een naam binnen een blok De twee variabelen hieronder hebben dezelfde spelling, maar horen bij verschillende bereiken. Binnen het blok wordt de binnenste naam gebruikt; daarna weer de buitenste. Dat heet afschermen, of shadowing. ```pliro # taal: nl laat bericht = "buiten" als waar: laat bericht = "binnen" zeg bericht zeg bericht ``` Voorspel eerst de volgorde. Je ziet `binnen` en daarna `buiten`. Een waarde veranderen met `zet` is iets anders dan een nieuwe binnenste variabele maken met `laat`. Naamopzoeking begint in het binnenste bereik en gaat naar buiten. Blokken, lusiteraties en functieaanroepen hebben lokale bereiken. `zet` wijzigt de gevonden bestaande variabele; een lokale `laat` kan een buitenste naam afschermen. Declaraties zijn zichtbaar vanaf hun plaats in de bron. Je kunt een functie niet vóór haar declaratie aanroepen. Een functie ziet wel haar eigen naam en kan dus direct recursief zijn. Wederzijds recursieve vooruitverwijzingen zijn niet ondersteund. Onbekende namen en dubbele declaraties in één bereik zijn controlefouten. Ingebouwde namen vormen een afschermbaar buitenste bereik. Kies eigen namen zorgvuldig: na een eigen `laat zeg = ...` verwijst `zeg` niet meer naar uitvoer. ## Gerelateerde lemma’s [Syntaxis en waarden](LEESMIJ.md) · [Ingebouwde functies](../ingebouwde-functies/LEESMIJ.md) · [Programmeergidsen](../gidsen/LEESMIJ.md)