Inom datorprogrammering är ett svansanrop en specifik situation inom programkällkoden där en funktion, subrutin eller procedur returnerar ett förväntat värde genom att anropa en annan funktion istället för att bara skicka en variabel som håller returvärdet. Själva namnet anger att funktionen som anropas för att beräkna värdet som ska returneras är i slutet, eller svansen, av funktionen som anropar den för att tillhandahålla ett returvärde. Ett slutanrop är av intresse för vissa programmerare eftersom, med vissa optimeringar eller kompilatorbeteenden, inget extra stackutrymme används för att lagra kodplatser för huvudfunktionen; tail-funktionen används istället för att generera returvärdesrapporterna direkt tillbaka till anropspunkten där den ursprungliga funktionen anropades. Användningen av ett slutanrop är särskilt användbart i situationer där rekursion används, eftersom mängden stackutrymme som används för att lagra anropsadresserna i fall där de rekursiva anropen kapslar mycket djupt snabbt kan ta slut och stoppa programexekveringen. Även om användning av slutanrop kan bidra till att öka hastigheten, minnesanvändningen och effektiviteten i ett program, kan det också leda till situationer där källkoden omstruktureras för att använda samtalen på ett sätt som gör det svårt att felsöka och spåra, särskilt med fall av rekursion.
Förekomsten av ett tail call beror till stor del på hur anropsstacken fungerar inom de flesta datorprogram och systemarkitekturer. Stacken, som är som en stapel med plattor, är en först in, sist ut datastruktur. När en funktion, subrutin eller procedur anropas lagras adressen från vilken anropet görs, kallad en stackram, i stacken. Detta innebär att ett program som anropar funktion A, som sedan anropar funktion B, kommer att ha två stackramar, en för funktion B och en annan under sig för funktion A. Efter att funktion B har körts färdigt fälls dess stackram från toppen av stack och exekvering återgår till funktion A, som har sin ram avstängd från stacken när den är klar, och slutligen återställer programkontrollen till den punkt från vilken den första funktionen ursprungligen anropades.
När ett tail call används, använder return-satsen i en funktion direkt returvärdet för en annan funktion som data som ska skickas till anropskoden. I exemplet ovan, om funktion A anropar funktion B direkt med retursatsen, har ett slutanrop bildats. Inom anropsstacken, istället för att ha en stackram för både funktion A och B, kommer funktion B att ta emot returadressen från funktion A och funktion A:s stackram kommer att poppas och kasseras, vilket betyder att funktion B skickar tillbaka sitt returvärde direkt. till platsen som anropade funktion A utan att först behöva skicka tillbaka kontrollen till funktion A. Detta ökar hastigheten på funktionsanrop samt hjälper till att hålla nere mängden information i stacken.
Egenskaperna hos ett svansanrop kan göra dem till ett mycket attraktivt alternativ för rekursiva funktioner. En rekursiv funktion är en som anropar sig själv upprepade gånger för att beräkna ett värde, vilket kan vara fallet när man korsar en listdatastruktur. Inga ytterligare stackramar skapas för de kapslade funktionsanropen, så mycket djupa nivåer av rekursion kan utföras säkert utan det omedelbara hotet om stackspill och eventuell programavslutning.