Tail Recursion ?
Já estava quase terminando o Lambda: the Ultimate Imperative quando me veio uma dúvida à cabeça, sobre a implementação Scheme que é mostrada no artigo anterior: como são implementadas as tail calls (chamadas finais) ?
Eu não analisei a implementação apresentada a fundo, até porque é MacLisp, um dialeto de mais de 30 anos de idade. Mas agora fiquei curioso com isso.
Em uma olhada superficial, a função EVLIS é a responsável pela avaliação de combinações, então aparentemente é aí que o controle deve ser transferido. Mas como diferenciar quando salvar e quando não salvar um quadro de ativação (CLINK, na notação do artigo) ?
A transferência entre as funções que implementam o interpretador é por meio de tail calls forçadas, utilizando a variável do contador de programa (**PC**); mas ainda não percebi como isso se reflete nas funções da linguagem interpretada... bom, verificarei isso.
Eu não analisei a implementação apresentada a fundo, até porque é MacLisp, um dialeto de mais de 30 anos de idade. Mas agora fiquei curioso com isso.
Em uma olhada superficial, a função EVLIS é a responsável pela avaliação de combinações, então aparentemente é aí que o controle deve ser transferido. Mas como diferenciar quando salvar e quando não salvar um quadro de ativação (CLINK, na notação do artigo) ?
A transferência entre as funções que implementam o interpretador é por meio de tail calls forçadas, utilizando a variável do contador de programa (**PC**); mas ainda não percebi como isso se reflete nas funções da linguagem interpretada... bom, verificarei isso.
0 Comments:
Post a Comment
<< Home