Functies binnen functies

Syntaxis en waarden

Een functie kan een andere functie bevatten. De binnenste functie onthoudt de omringende variabelen die ze gebruikt, ook nadat de buitenste functie klaar is. Dat heet een closure: een functie die toegang tot haar eigen variabelen bewaart. Denk aan een functie die haar eigen scorekaart bijhoudt.

Ze onthoudt de variabelen, geen bevroren kopie van hun eerste waarden. Dezelfde teller verandert hieronder aantal bij elke aanroep. Je ziet dus 1 en daarna 2. Een nieuwe aanroep van maakTeller maakt een aparte teller.

Lexicaal bereik betekent de namen die beschikbaar zijn waar een functie in de code staat. Het hangt niet af van wie de functie aanroept. Functies zijn volwaardige waarden: je kunt ze in een variabele bewaren, doorgeven aan een andere functie of teruggeven. Een anonieme functie, ook lambda genoemd, zou geen gedeclareerde naam hebben; Pliro vereist nu benoemde functiedeclaraties.

Functies zijn waarden, hebben een vast aantal positionele argumenten en kunnen
worden doorgegeven, teruggegeven en lokaal gedeclareerd. Hun buitenste bereik
is het bereik van de declaratie, niet dat van de aanroeper. Ze blijven verwijzen
naar de gevangen variabelen en zien latere wijzigingen daarvan.

# taal: nl
functie maakTeller():
    laat aantal = 0
    functie volgende():
        zet aantal = aantal + 1
        geef aantal
    geef volgende

laat teller = maakTeller()
zeg teller()
zeg teller()

Iedere aanroep van maakTeller maakt een afzonderlijke gevangen variabele. Twee door dezelfde maakTeller-aanroep verkregen verwijzingen naar volgende delen juist diezelfde variabele. De aanroeper kiest niet het lexicale buitenbereik van de functie.

Gerelateerde lemma’s

Syntaxis en waarden · Ingebouwde functies · Programmeergidsen