5.4.3 Blocos, Atribuições e Declarações
Blocos
O corpo de um bloco é avaliado com respeito ao ambiente atual estendido por um frame que vincula todos os nomes locais ao valor "*unassigned*". Temporariamente fazemos uso do registrador val para armazenar a lista de todas as variáveis declaradas no bloco, que é obtida por scan_out_declarations da seção 4.1.1. As funções scan_out_declarations e list_of_unassigned são assumidas como estando disponíveis como operações de máquina.1
Atribuições e declarações
Atribuições são tratadas por ev_assignment, que é alcançado a partir de eval_dispatch com a expressão de atribuição em comp. O código em ev_assignment primeiro avalia a parte do valor da expressão e então instala o novo valor no ambiente. A função assign_symbol_value é assumida como estando disponível como uma operação de máquina.
Declarações de variáveis e constantes são tratadas de maneira similar. Note que enquanto o valor de uma atribuição é o valor que foi atribuído, o valor de uma declaração é undefined. Isso é tratado configurando val como undefined antes de continuar. Assim como no avaliador metacircular, transformamos uma declaração de função em uma declaração de constante cuja expressão de valor é uma expressão lambda. Isso acontece em ev_function_declaration, que faz a transformação no lugar em comp e passa para ev_declaration.
Exercício 5.28
Estenda o avaliador para tratar laços while, traduzindo-os para aplicações de uma função while_loop, conforme mostrado no exercício 4.9. Você pode colar a declaração da função while_loop na frente dos programas do usuário. Você pode "trapacear" assumindo que o transformador sintático while_to_application está disponível como uma operação de máquina. Consulte o exercício 4.9 para discutir se essa abordagem funciona se instruções return, break e continue são permitidas dentro do laço while. Se não, como você pode modificar o avaliador de controle explícito para executar programas com laços while que incluem essas instruções?
Exercício 5.29
Modifique o avaliador de modo que ele use avaliação em ordem normal, baseado no avaliador preguiçoso da seção 4.2.