| English | Português (Brasil) |
Funções são rotinas nomeadas e alocadas estaticamente que retornam um valor
byte ou boolean. As declarações aparecem junto dos procedimentos depois da
seção global var e antes do bloco principal.
function Add(Left: byte; Right: byte): byte;
begin
Add := Left + Right;
end;
function Ready(Value: byte): boolean;
begin
Ready := Value >= $10;
end;
Os parâmetros são passados por valor e podem ser byte ou boolean. Uma
declaração sem parâmetros omite a lista; toda chamada usa parênteses, inclusive
sem parâmetros:
function CurrentScore: byte;
begin
CurrentScore := Score;
end;
Score := Add(CurrentScore(), $01);
O nome da função é o alvo do resultado e precisa receber um valor do tipo
declarado em todos os caminhos que chegam ao fim. Não há return antecipado.
Argumentos são avaliados da esquerda para a direita. and e or mantêm o
curto-circuito da esquerda para a direita. Em aritmética e comparações, um lado
direito simples é consumido depois do esquerdo; quando o lado direito exige
avaliação, ele é avaliado primeiro e preservado. Assim,
LeftCall() - RightCall() executa RightCall() primeiro.
Parâmetros usam a convenção estática em RAM comum dos procedimentos. O retorno
é carregado no acumulador A antes de RTS. Cada função recebe um byte
explícito em RAM comum para o resultado; programas sem funções não alocam esse
armazenamento, segmento ou código.
Chamadas podem alterar A, X, Y e os flags do processador. Nenhum
registrador de uso geral é preservado pelo chamado; somente temporários
gerenciados pelo compilador e os locais estáticos de parâmetros/resultados
transportam valores através da chamada. Os endereços de retorno de JSR usam a
pilha de hardware reservada, novamente balanceada por RTS.
O compilador analisa o grafo acíclico completo e preserva temporários do
chamador e argumentos anteriores durante chamadas aninhadas. Recursão direta,
indireta e ciclos mistos são rejeitados com E3014. Não há variáveis locais,
frames de runtime, parâmetros por referência, argumentos padrão, sobrecarga ou
retornos agregados. Funções não podem ser callbacks de quadro.
Veja o exemplo de funções.