Funções e procedimentos
Funções encapsulam lógica reutilizável e retornam um valor. No topo do arquivo, você declara funções com a palavra-chave function.
Declarando uma função
A forma geral é function nome(parâmetros): Tipo begin ... return expr; end;. Note o ; final após a declaração no nível superior:
function saudar(nome: String): String
begin
return "Olá, " + nome + "!";
end;
begin
WriteLn(saudar("Ana"));
end.Olá, Ana!
O tipo depois dos : é o tipo do valor retornado. A instrução return expr; devolve esse valor e encerra a função.
Parâmetros
Os parâmetros são separados por vírgula. Eles podem ser tipados ou não tipados:
// parâmetros tipados
function somar(a: Integer, b: Integer): Integer
begin
return a + b;
end;
// parâmetros sem tipo explícito
function juntar(x, y): String
begin
return x + " " + y;
end;
begin
WriteLn(somar(3, 4));
WriteLn(juntar("bom", "dia"));
end.7 bom dia
Tipe seus parâmetros
Declarar o tipo dos parâmetros torna a intenção clara e ajuda o interpretador a validar os valores. Prefira parâmetros tipados sempre que possível.
Chamando funções
Chame uma função pelo nome, passando os argumentos entre parênteses. Se a função não tiver argumentos, os parênteses são opcionais:
function agora(): String
begin
return "sempre agora";
end;
begin
WriteLn(agora()); // com parênteses
WriteLn(agora); // sem parênteses — equivalente
end.sempre agora sempre agora
Recursão
Uma função pode chamar a si mesma. O exemplo clássico é o fatorial:
function fatorial(n: Integer): Integer
begin
if n <= 1 then
return 1;
return n * fatorial(n - 1);
end;
begin
WriteLn("5! = ", fatorial(5));
WriteLn("6! = ", fatorial(6));
end.5! = 120 6! = 720
Sempre tenha um caso base
Toda função recursiva precisa de uma condição de parada (aqui, n <= 1). Sem ela, a recursão nunca termina.
E os procedimentos?
Um procedimento é como uma função, mas não retorna valor — serve para executar efeitos (imprimir, alterar estado). No NeoObjectPascal, procedimentos existem como membros de classes, declarados com a palavra-chave procedure:
class Logger
public procedure registrar(msg: String)
begin
WriteLn("[LOG] " + msg);
end;
end;
var log: Object;
begin
log := new Logger();
log.registrar("iniciando");
end.[LOG] iniciando
Para explorar procedimentos, métodos e visibilidade em profundidade, veja Classes.
A seguir, aprenda a trabalhar com coleções em Arrays.