Usina BRAdvPL Guia
Entrar
← Todos os tópicos
FUNDAMENTOPublicado

Blocos de código (CodeBlock)

{ |[parâmetros]| [expressão1, expressão2, ...] }

Crie funções anônimas armazenáveis, receba parâmetros e avalie expressões sob demanda com Eval().

CodeBlockBlocos de códigoEvalFunções anônimasExpressões
01 · VISÃO GERAL

Visão geral

Um bloco de código é um valor AdvPL do tipo B (Block), semelhante a uma função anônima. Ele pode receber parâmetros e executar uma ou mais expressões separadas por vírgulas. Eval() executa o bloco e devolve o resultado da última expressão. Diferentemente de uma função comum, o corpo do bloco aceita expressões e chamadas de funções, mas não comandos da linguagem.

02 · SINTAXE

Sintaxe

{ |[parâmetros]| [expressão1, expressão2, ...] }

Parâmetros

parâmetros
ListaOpcional

Nomes entre as barras verticais. São locais ao bloco e recebem os argumentos fornecidos na avaliação.

expressões
AdvPLOpcional

Uma ou mais expressões separadas por vírgulas e executadas da esquerda para a direita.

retorno
QualquerOpcional

Resultado da última expressão; um bloco vazio retorna NIL.

03 · EXEMPLO PRÁTICO

Bloco simples com retorno

User Function ExBlocoSoma()
    Local bSomar := { |nValor1, nValor2| Abs(nValor1) + Abs(nValor2) }
    Local nResultado := Eval(bSomar, 10, -20)

    ConOut("Resultado: " + CValToChar(nResultado))
Return
Resultado esperado

Eval() fornece os dois parâmetros e recebe 30, resultado da última e única expressão.

04 · EXEMPLO PRÁTICO

Várias expressões

User Function ExBlocoLista()
    Local bCalcular := { |nValor| ConOut("Valor recebido: " + CValToChar(nValor)), nValor * 2 }
    Local nResultado := Eval(bCalcular, 5)

    MsgInfo("Dobro: " + CValToChar(nResultado))
Return
Resultado esperado

As expressões são avaliadas da esquerda para a direita e o retorno é 10, resultado da última expressão.

05 · EXEMPLO PRÁTICO

Ordenação personalizada com ASort

User Function ExOrdenacao()
    Local aNomes := {"CARLA", "ANDREA", "BEATRIZ"}
    Local bDecrescente := { |cNome1, cNome2| cNome1 > cNome2 }

    ASort(aNomes, , , bDecrescente)
Return
Resultado esperado

O bloco compara pares selecionados por ASort() e permite ordenar o array em ordem decrescente.

06 · EXEMPLO PRÁTICO

Parâmetro por referência

User Function ExReferencia()
    Local bIncrementar := { |nValor| nValor += 1 }
    Local nContador := 0

    Eval(bIncrementar, nContador)  // nContador continua 0
    Eval(bIncrementar, @nContador) // nContador passa a 1
Return
Resultado esperado

Sem @, o bloco recebe uma cópia do conteúdo; com @, a alteração alcança a variável original.

07 · EXEMPLO PRÁTICO

Captura de variável local

User Function ExContexto()
    Local nContador := 0
    Local bSomar := { |nValor| nContador += nValor }

    Eval(bSomar, 5)
    ConOut("Contador: " + CValToChar(nContador))
Return
Resultado esperado

O bloco referencia e altera nContador no contexto Local em que foi criado.

BOAS PRÁTICAS
  • As chaves delimitam o bloco e as duas barras verticais delimitam sua lista de parâmetros, mesmo quando ela está vazia.
  • Parâmetros do bloco possuem escopo restrito ao próprio bloco.
  • Eval(bBloco, argumentos...) executa o conteúdo; @ permite passar uma variável por referência.
  • Blocos são usados em eventos de componentes visuais, ordenações, avaliações e outras APIs que recebem comportamento como argumento.
  • Um bloco pode capturar uma variável Local visível no momento de sua criação e manter esse contexto enquanto continuar referenciado.
ARMADILHAS COMUNS
  • { .T. } e { IIF(...) } são arrays de um elemento, não blocos de código; faltam as barras verticais.
  • Evite blocos extensos: extraia a lógica para uma função e use o bloco apenas para chamá-la.
  • A referência oficial desaconselha chamar Static Function dentro de um bloco que possa ser executado em outro fonte, pois nomes estáticos iguais podem gerar comportamento indeterminado.
  • Armazenar por muito tempo um bloco que capturou contexto Local pode manter essa área de memória viva; remova referências com NIL quando o bloco não for mais necessário.
  • Respeite a quantidade de parâmetros e o tipo de retorno esperados pela função que executará o bloco.

Conteúdos relacionados

REFERÊNCIAS
  1. TOTVS. Blocos de Código. TDN. Criado por Adriana Panseri Santos; última alteração por Julio Wittwer em 11 set. 2021.
Situação
Publicado
Página criada em
Última revisão em
Idioma original
Português
Revisão
Usina.BR