Function
Um objeto4D. Function
contém um pedaço de código que pode ser executado de um objeto, seja usando o operador ()
ou usando as funções apply()
e call()
. 4D propõe três tipos de objetos Function
:
- funções nativas, ou seja, funções integradas, built-in, de várias classes 4D tais como
collection.sort()
oufile.copyTo()
. - funções usuário, ciradas em classes usuário usanod a palavra chave Function.
- funções fórmula, ou seja funções que podem executar qualquer fórmula 4D.
Objetos de formulários
Os comandos Formula e Formula from string permitem criar objetos 4D. Function
para executar expressões ou códigos 4D expressos como texto.
Objetos formulário podem ser encapsulados em propriedades objeto:
var $f : 4D. Function
$f:=New object
$f.message:=Formula(ALERT("Hello world"))
Essa propriedade é uma "função objeto" ou seja uma função que é restrita a seu objeto pai. Para executar uma função armazenada em uma propriedade objeto, use o operador () depois do nome propriedade, tal como:
$f.message() //exibe "Hello world"
Também se admite a sintaxe com parênteses:
$f["message"]() //exibe "Hello world"
Note que mesmo se não tiver parênteses (ver abaixo), uma função objeto a ser executada deve ser chamda com () parênteses. Chamar só a propriedade de objeto devolverá uma nova referência à fórmula (e não a executará):
$o:=$f.message //devolve o objeto fórmula em $o
Também pode executar uma função usando as funções apply()
e call()
:
$f.message.apply() //exibe "Hello world"
Utilização de parâmetros
Pode passar parâmetros para suas fórmulas usando o parâmetro sequencial syntax baseado em $1, $2...$n. For example, you can write: Por exemplo, pode escrever: Por exemplo, pode escrever:
var $f : Object
$f:=New object
$f.message:=Formula(ALERT("Hello "+$1))
$f.message("John") //exibe "Hello John"
Ou usando a função.call():
var $f : Object
$f:=Formula($1+" "+$2)
$text:=$f.call(Null;"Hello";"World") //retorna "Hello World"
$text:=$f.call(Null;"Welcome to";String(Year of(Current date))) //retorna "Welcome to 2019" (por exemplo)
Parâmetros a um único método
Para mais conveniência, quando a fórmula é feita de um único método de projeto, parâmetros podem ser omitidos na inicialização do objeto fórmula. Pode ser passado quando a fórmula for chamada. Por exemplo:
var $f : 4D. Function
$f:=Formula(myMethod)
//Não é necessário escrever Formula(myMethod($1;$2))
$text:=$f.call(Null;"Hello";"World") //retorna "Hello World"
$text:=$f.call() //retorna "How are you?"
//myMethod
#DECLARE ($param1 : Text; $param2 : Text)->$return : Text
If(Count parameters=2)
$return:=$param1+" "+$param2
Else
$return:="How are you?"
End if
Parâmetros são recebidos dentro do método, na ordem que são especificados na chamada.
Resumo
.apply() : any .apply( thisObj : Object { ; formulaParams : Collection } ) : any executa a fórmula objecto a que é aplicado e devolve o valor resultante |
.call() : any .call( thisObj : Object { ; ...params : any } ) : any executa a fórmula objecto a que é aplicado e devolve o valor resultante |
.source : Text contém a expressão de origem da fórmula como texto |
Formula
Histórico
Release | Mudanças |
---|---|
17 R6 | Renomeado (New formula -> Formula) |
17 R3 | Adicionado |
Formula ( formulaExp : Expression ) : 4D. Function
Parâmetro | Tipo | Descrição | |
---|---|---|---|
formulaExp | Expression | -> | Fórmula a ser retornada como objeto |
Resultados | 4D. Function | <- | Função nativa encapsulando a fórmula |
|
Descrição
O comando Formula
cria um objecto 4D Função
com base na expressão formulaExp. formulaExp pode ser tão simples quanto um único valor ou tão complexo quanto um método projeto com parâmetros.
Ter uma fórmula como se fosse um objeto permite que seja passada como um parâmetro (atributo calculado) para comandos ou métodos, ou para ser executado a partir de vários componentes, sem precisar declará-los como "partilhados por componentes e database host". Quando chamado, o objeto fórmula é avaliado sem o contexto do banco de dados ou componente que o criou.
A fórmula retornada pode ser chamada com:
- métodos
.call()
ou.apply()
, ou - sintaxe notação objeto (ver formula object).
var $f : 4D. Function
$f:=Formula(1+2)
$o:=New object("myFormula";$f)
//três formas diferentes de chamar a fórmula
$f.call($o) //retorna 3
$f.apply($o) //retorna 3
$o.myFormula() //retorna 3
Pode passar parametros para a Formula
, como visto em exemplo 4.
Pode especificar o objeto no qual a fórmula é executada, como visto em exemplo 5. As propriedades do objeto podem ser acessadas via o comando This
.
Se formulaExp usar variáveis locais, seus valores são copiados e armazenados no objeto fórmula retornados quando forem criados. Quando executados, a fórmula usa esses valores copiados ao invés do valor atual da variável local. Note que usar arrays como variáveis locais não são compatíveis.
Os objetos criados por Formula
podem ser salvos, por exemplo, em um campo de database ou em um documento blob.
Exemplo 1
Uma fórmula simples:
var $f : 4D. Function
$f:=Formula(1+2)
var $o : Object
$o:=New object("f";$f)
$result:=$o.f() // devoluções 3
Exemplo 2
Uma fórmula usando um método projeto com parâmetros:
$value:=10
$o:=New object("f";Formula($value))
$value:=20
$result:=$o.f() // retorna 10
Exemplo 3
Uma fórmula usando variáveis locais:
$o:=New object("f";Formula($1+$2))
$result:=$o.f(10;20) //retorna 30
Exemplo
Uma fórmula simples usando parâmetros:
$o:=New object("f";Formula(myMethod))
$result:=$o.f("param1";"param2") // equivalent to $result:=myMethod("param1";"param2")
Exemplo 2
Usar This
:
$o:=New object("fullName";Formula(This.firstName+" "+This.lastName))
$o.firstName:="John"
$o.lastName:="Smith"
$result:=$o.fullName() //retorna "John Smith"
Exemplo 6
Chamar uma fórmula usando notação de objeto:
var $feta; $robot : Object
var $calc : 4D. Function
$robot:=New object("name";"Robot";"price";543;"quantity";2)
$feta:=New object("name";"Feta";"price";12.5;"quantity";5)
$calc:=Formula(This.total:=This.price*This.quantity)
//estabelece a fórmula às propriedades objeto
$feta.calc:=$calc
$robot.calc:=$calc
//chame a fórmula
$feta.calc() // $feta={name:Feta,price:12.5,quantity:5,total:62.5,calc:"[object Formula]"}
$robot.calc() // $robot={name:Robot,price:543,quantity:2,total:1086,calc:"[object Formula]"}
Formula from string
Histórico
Release | Mudanças |
---|---|
17 R6 | Renomeado New formula from string -> Formula from string |
17 R3 | Adicionado |
Formula from string( formulaString : Text ) : 4D. Function
Parâmetro | Tipo | Descrição | |
---|---|---|---|
formulaString | Text | -> | Fórmula texto a ser retornada como objeto |
Resultados | 4D. Function | <- | Objeto nativo encapsulando a fórmula |
|
Descrição
O comando Formula from string
cria um objecto 4D. Function baseado na formulaString. formulaString pode ser tão simples quanto um único valor ou tão complexo quanto um método projeto com parâmetros.
Esse comando é similar a Formula
, exceto que maneja uma fórmula baseada em texto. Na maioria dos casos, é recomendado usar o comando Formula
. Só se deve usarFormula from string
quando a fórmula original for expressa como texto (por exemplo armazenada externamente em um arquivo JSON). Nesse contexto, usar sintaxe com tokens é aconselhado.
Como conteúdos de variáveis locais não podem ser acessados por nome em modo compilado, não podem ser usados em formulaString. Tentar acessar uma variável local com
Formula from string
vai causar um erro (-10737).
Exemplo
O código abaixo cria um diálogo aceitando uma fórmula em formato texto:
var $textFormula : Text
var $f : 4D. Function
$textFormula:=Request("Please type a formula")
If(ok=1)
$f:=Formula from string($textFormula)
ALERT("Result = "+String($f.call()))
End if
...e executa a fórmula:
.apply()
Histórico
Release | Mudanças |
---|---|
17 R3 | Adicionado |
.apply() : any
.apply( thisObj : Object { ; formulaParams : Collection } ) : any
Parâmetro | Tipo | Descrição | |
---|---|---|---|
thisObj | Object | -> | Objeto a ser retornado pelo comando This na fórmula |
formulaParams | Collection | -> | Coleção de valores a serem passados como $1...$n quando formula for executado |
Resultados | any | <- | Valores de execução de fórmula |
|
Descrição
A função .apply()
executa a fórmula
objecto a que é aplicado e devolve o valor resultante. O objeto fórmula pode ser criado usando os comandos Formula
or Formula from string
.
No parâmetro thisObj pode passar uma referência ao objeto a ser usada como This
dentro da fórmula.
Também pode passar uma coleção a ser usada como parâmetros $1...$n na fórmula usando o parâmetro opcional formulaParams.
Note que .apply()
é similar a .call()
exceto que parâmetros são passados como coleção. Isso pode ser útil para passar resultados calculados.
Exemplo 1
var $f : 4D. Function
$f:=Formula($1+$2+$3)
$c:=New collection(10;20;30)
$result:=$f.apply(Null;$c) // retorna 60
Exemplo 2
var $calc : 4D. Function
var $feta; $robot : Object
$robot:=New object("name";"Robot";"price";543;"quantity";2)
$feta:=New object("name";"Feta";"price";12.5;"quantity";5)
$calc:=Formula(This.total:=This.price*This.quantity)
$calc.apply($feta) // $feta={name:Feta,price:12.5,quantity:5,total:62.5}
$calc.apply($robot) // $robot={name:Robot,price:543,quantity:2,total:1086}
.call()
Histórico
Release | Mudanças |
---|---|
17 R3 | Adicionado |
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
Parâmetro | Tipo | Descrição | |
---|---|---|---|
thisObj | Object | -> | Objeto a ser retornado pelo comando This na fórmula |
params | any | -> | Valores a serem passados como $1...$n quando a fórmula for executada |
Resultados | any | <- | Valores de execução de fórmula |
|
Descrição
A função .call()
executa a fórmula
objecto a que é aplicado e devolve o valor resultante. O objeto fórmula pode ser criado usando os comandos Formula
or Formula from string
.
No parâmetro thisObj pode passar uma referência ao objeto a ser usada como This
dentro da fórmula.
Pode passar valores a serem usados como parâmetros $1...$n na fórmula usando os parâmetros opcionais params.
Note que .call()
é similar a .apply()
exceto que parâmetros são passados diretamente.
Exemplo 1
var $f : 4D. Function
$f:=Formula(Uppercase($1))
$result:=$f.call(Null;"hello") // retorna "HELLO"
Exemplo 2
$o:=New object("value";50)
$f:=Formula(This.value*2)
$result:=$f.call($o) // devolve 100
.source
Histórico
Release | Mudanças |
---|---|
18 R2 | Adicionado |
.source : Text
Descrição
A propriedade .source
contém a expressão de origem da fórmula
como texto.
Essa propriedade é apenas leitura.
Exemplo
var $of : 4D. Function
var $tf : Text
$of:=Formula(String(Current time;HH MM AM PM))
$tf:=$of.source //"String(Current time;HH MM AM PM)"