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

AspectoCodeblockFuncao
Sintaxe{|x| x*2}Static Function...
AnonimoSimNao (tem nome)
ClosureSim — captura escopoNao
PerformanceLevemente mais lentoLevemente mais rapido
Caso de usoCallback, inlineLogica nomeada

Pegadinhas

Veja também