Call-by-name

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

Call-by-name is een mechanisme in programmeertalen om parameters (en impliciet ook functies) mee te geven aan procedures.

Als een variabele bij naam wordt meegegeven in de aanroep van een procedure dan wordt tijdens het uitvoeren van het programma het adres van die variabele gebruikt. Verandert de naam van de variabele tijdens de uitvoering, bijvoorbeeld omdat het een arrayelement betreft waarvan de index door de procedure zelf wordt aangepast, dan verandert ook het adres van de call-by-name parameter.

Dat is ook het verschil met het call-by-reference mechanisme. Ook daar wordt het adres van de variabele meegegeven, maar dat wordt niet meer aangepast door de procedure.

Call-by-name is onderdeel van de programmeertaal Algol-60 en wordt ook gebruikt in Burroughs Extended Algol en varianten daarvan zoals ESPOL en NEWP. In Algol-60 is de keuze voor parameters van procedures tussen call-by-value en call-by-name. Ook Simula ondersteunt ondersteunt call-by-name.

Alhoewel call-by-name elegante programmeeroplossingen biedt zoals het Jensen device, blijkt het gebruik ervan niet direct uit de broncode van het programma. Commentaar in het programma zelf is essentieel. De declaraties zoals bijvoorbeeld in de toelichting bij het Jensen device werken bovendien onduidelijkheden in de hand. De broncode bij het voorbeeld in Wikipedia suggereert in het geheel niet dat er een totaal wordt berekend van alle elementen in een vector. De nietsvermoedende waarnemer zou eerder tot de conclusie komen dat er sprake is van een omslachtige manier van vermenigvuldigen. Omdat call-by-name bepaalde subtiele bugs in de hand werkt en de implementatie van call-by-name relatief inefficient is, zijn er nog maar weinig programmeertalen die call-by-name ondersteunen.

De syntactische correctheid is altijd toetsbaar door de compiler. Op het moment van de aanroep van de procedure is het type van de actuele parameter bekend en ook de afhankelijkheid naar andere parameters.