Vad är ett svanssamtal?
Vid datorprogrammering är ett svarssamtal en specifik situation inom programkällkoden där en funktion, subroutin eller procedur returnerar ett förväntat värde genom att ringa en annan funktion istället för att helt enkelt passera en variabel som håller tillbaka värdet. Namnet i sig anger att den funktion som kallas för att beräkna värdet som ska returneras är i slutet, eller svansen, på den funktion som kallar den för att leverera ett returvärde. Ett svarssamtal ä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; i stället används svansfunktionen för att generera rapporteringen om returvärde direkt tillbaka till den samlingspunkt där den ursprungliga funktionen åberopades. Användningen av ett svanssamtal är särskilt användbart i situationer där rekursion används, eftersom mängden buntutrymme som används för att lagra den som ringer adress i fall där rekursiva samtal häckar mycket djupt kan snabbt ta slut och stoppa programutförandet. Även om användning av svarssamtal kan hjälpa 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 svanssamtal beror till stor del på hur samtalstacken fungerar inom de flesta datorprogram och systemarkitekturer. Bunten, som är som en bunt med plattor, är en först-in, sista-out datastruktur. När en funktion, subroutin eller procedur anropas lagras adressen från vilken samtalet görs, kallad en stapelram, i bunten. Detta innebär att ett program som kallar funktion A, som sedan kallar funktion B, kommer att ha två stapelramar, ett för funktion B och ett annat under det för funktion A. Efter att funktion B är klar exekveras poppas dess stapelram upp från toppen av stack och exekvering återgår till funktion A, som har sin ram som släppts ut från bunten när den är klar, och slutligen återgår programkontrollen till den punkt från vilken den första funktionen ursprungligen kallades.
När ett svarssamtal används, använder returrättet i en funktion direkt returvärdet för en annan funktion som data som ska skickas till samtalskoden. I exemplet ovan, om funktion A anropar funktion B direkt med returrättet, har ett svanssamtal bildats. I samtalstacken, i stället för att ha en stapelram för båda funktionerna A och B, kommer Funktion B att få returadressen från Funktion A och Funktion A: s stapelram kommer att släppas och bortskaffas, vilket betyder att Funktion B kommer att lämna tillbaka sitt värde direkt tillbaka till platsen som hette funktion A utan att först behöva skicka tillbaka kontrollen till funktion A. Detta ökar hastigheten för funktionssamtal och hjälper till att hålla nere mängden information i bunten.
Egenskaperna hos ett svanssamtal kan göra dem till ett mycket attraktivt alternativ för rekursiva funktioner. En rekursiv funktion är en funktion som kallar sig upprepade gånger för att beräkna ett värde, vilket kan vara fallet när man korsar en listdatastruktur. Inga ytterligare stapelramar skapas för de kapslade funktionssamtalen, så mycket djupa rekursionsnivåer kan utföras säkert utan omedelbart hot om ett stacköverskridande och eventuell programavslutning