Eval
Executa um codeblock passando parametros. Bloco da construcao da programacao funcional em AdvPL — callbacks, validadores, comparadores.
Assinatura: Eval(bBlock, [xParam1, ...]) -> xResultado
Retorna: Any (depende do bloco)
Eval executa um codeblock — funcao anonima do AdvPL — passando os parametros. E o que viabiliza programacao funcional na linguagem: callbacks, validadores, comparadores customizados.
Sintaxe
Eval(bBlock, [xParam1, xParam2, ...]) --> xRet
// bBlock = codeblock {|p1, p2| expressao}
Exemplos basicos
// Codeblock sem parametros
bSoma := {|| 5 + 3}
Eval(bSoma) // 8
// Com parametros
bDobro := {|n| n * 2}
Eval(bDobro, 7) // 14
// Com varios parametros
bSoma2 := {|a, b| a + b}
Eval(bSoma2, 3, 7) // 10
Casos praticos
1. Callback em validacao
Static Function ValidaCampo(cValor, bValidador)
Return Eval(bValidador, cValor)
// Uso
lOk := ValidaCampo("12345", {|x| Len(x) == 5})
lOk := ValidaCampo("a@b.com", {|x| At("@", x) > 0})
2. Comparador customizado pra ordenar array
aArr := { {"B", 10}, {"A", 5}, {"C", 20} }
// Ordena por col 1 (alfabetico)
aSort(aArr, NIL, NIL, {|x, y| x[1] < y[1]})
// Ordena por col 2 (numerico decrescente)
aSort(aArr, NIL, NIL, {|x, y| x[2] > y[2]})
3. ExecBlock (callback chamado por nome)
// Ponto de Entrada e basicamente Eval em ExistBlock
If ExistBlock("M030LOK")
lOk := ExecBlock("M030LOK", .F., .F.)
EndIf
// ExecBlock internamente faz Eval do bloco apontado pelo PE
4. Pipeline de transformacoes
// Aplica varias transformacoes em sequencia
aTransform := { ;
{|s| AllTrim(s)}, ;
{|s| Upper(s)}, ;
{|s| StrTran(s, "-", "")} ;
}
cResultado := " abc-def "
For i := 1 To Len(aTransform)
cResultado := Eval(aTransform[i], cResultado)
Next
// "ABCDEF"
Codeblocks vs Funcoes
| Aspecto | Codeblock | Funcao |
|---|---|---|
| Sintaxe | {|x| x*2} | Static Function... |
| Anonimo | Sim | Nao (tem nome) |
| Closure | Sim — captura escopo | Nao |
| Performance | Levemente mais lento | Levemente mais rapido |
| Caso de uso | Callback, inline | Logica nomeada |
Pegadinhas
- Bloco com mais parametros que voce passa — params faltantes ficam NIL.
- Bloco com menos parametros que voce passa — params extras ignorados.
- Performance — Eval em loop apertado e mais lento que codigo inline. Em loops gigantes, considere expansao manual.
- Closures — bloco captura variaveis do escopo. Modificar variavel apos criar o bloco afeta seu comportamento.