メインコンテンツまでスキップ
バージョン: 20

Function

4D.Function オブジェクトにはコードが格納されています。 このコードは () 演算子を使用して、または apply() や call() 関数を使用して呼び出すことができます。 4D では 3種類の Function オブジェクトが利用できます:

  • ネイティブ関数 (collection.sort() や file.copyTo() などの 4Dクラスにビルトインされた関数)。
  • ユーザー関数 (ユーザークラス において Function キーワードを使って作成されたもの)。
  • フォーミュラ関数 (4Dフォーミュラを実行するもの)。

フォーミュラオブジェクト​

The Formula and Formula from string commands allow you to create 4D.Function objects to execute any 4D expression or code expressed as text.

Formulaオブジェクトは、オブジェクトプロパティに格納することができます。

var $f : 4D.Function
$f:=New object
$f.message:=Formula(ALERT("Hello world"))

このようなプロパティは "オブジェクト関数"、つまり親オブジェクトに紐づいた関数です。オブジェクトプロパティに保存されている関数を実行するには、プロパティ名のあとに () をつけます:

$f.message() // "Hello world" を表示します

大カッコを使用したシンタックスもサポートされます:

$f["message"]() // "Hello world" と表示します

たとえ引数を受け取らなかったとしても (後述参照)、オブジェクト関数を実行するためにはカッコ ( ) をつけて呼び出す必要があるという点に注意してください。オブジェクトプロパティのみを呼び出した場合、フォーミュラへの新しい参照が返されます (そしてフォーミュラは実行はされません):

$o:=$f.message // $o にはフォーミュラオブジェクトが返されます

apply() および call() 関数を使って関数を実行することもできます:

$f.message.apply() // "Hello world!" を表示します

引数の受け渡し​

フォーミュラには、順番引数シンタックス $1, $2...$n を使用して引数を渡すことができます。たとえば:

var $f : Object
$f:=New object
$f.message:=Formula(ALERT("Hello "+$1))
$f.message("John") // "Hello John" を表示します

あるいは、.call() 関数を使用して:

var $f : Object
$f:=Formula($1+" "+$2)
$text:=$f.call(Null;"Hello";"World") // "Hello World" を返します
$text:=$f.call(Null;"Welcome to";String(Year of(Current date))) // "Welcome to 2019" (例) を返します

単一メソッド用の引数​

利便性のために、フォーミュラが単一のプロジェクトメソッドから作成された場合には、引数はフォーミュラオブジェクトの初期化では省略することができます。省略された引数は、フォーミュラを呼び出す時に一緒に渡すことができます。例:

var $f : 4D.Function

$f:=Formula(myMethod)
// ここで Formula(myMethod($1;$2) と書く必要はありません
$text:=$f.call(Null;"Hello";"World") // "Hello World" を返します
$text:=$f.call() // "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

引数はメソッド内において、呼び出し時に指定した順で受け取られます。

概要​

.apply() : any
.apply( thisObj : Object { ; formulaParams : Collection } ) : any
    対象の Formula オブジェクトを実行し、その結果の値を返します
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
    対象の Formula オブジェクトを実行し、その結果の値を返します
.source : Text     対象フォーミュラのテキスト型のソース式

Formula​

履歴
リリース内容
17 R6名称変更 (New formula -> Formula)
17 R3追加

Formula ( formulaExp : Expression ) : 4D.Function

引数型説明
formulaExp式->オブジェクトとして返されるフォーミュラ
戻り値4D.Function<-フォーミュラを格納しているネイティブな Function オブジェクト

説明​

Formula コマンドは、 formulaExp の式に基づいた 4D Function オブジェクトを作成します。 formulaExp には単一の値のようにシンプルなものから、引数を持つプロジェクトメソッドのように複雑なものまで指定することができます。 formulaExp には単一の値のようにシンプルなものから、引数を持つプロジェクトメソッドのように複雑なものまで指定することができます。

フォーミュラがオブジェクトとして存在することで、コマンドやメソッドに対して引数 (計算された属性) として渡したり、"コンポーネントとホストデータベース間で共有" として宣言せずとも様々なコンポーネントから実行したりできるようになります。呼び出されたフォーミュラオブジェクトは、それを作成したデータベースあるいはコンポーネントのコンテキストにおいて評価されます。

返されたフォーミュラは以下の方法で呼び出すことが可能です:

var $f : 4D.Function
$f:=Formula(1+2)
$o:=New object("myFormula";$f)

// フォーミュラを呼び出す 3つの方法
$f.call($o) // 3 を返します
$f.apply($o) // 3 を返します
$o.myFormula() // 3 を返します

フォーミュラには 引数 を渡すことができます (例題4 参照)。

フォーミュラの実行対象となるオブジェクトを指定することができます (例題5 参照)。フォーミュラの実行対象となるオブジェクトを指定することができます (例題5 参照)。 このオブジェクトのプロパティは、 This コマンドでアクセス可能です。

formulaExp がローカル変数を使用する場合、返されるフォーミュラオブジェクトの作成時にその値がそこにコピーされ保存されます。 実行時、フォーミュラはそのローカル変数の現在値ではなく、コピーされた値を使用します。 ローカル変数として配列を使用することはサポートされていない点に注意してください。実行時、フォーミュラはそのローカル変数の現在値ではなく、コピーされた値を使用します。ローカル変数として配列を使用することはサポートされていない点に注意してください。

Formula によって作成されたオブジェクトは、たとえばデータベースのフィールドや Blob ドキュメントなどに保存可能です。

例題 1​

単純なフォーミュラの例:

var $f : 4D.Function
$f:=Formula(1+2)

var $o : Object
$o:=New object("f";$f)

$result:=$o.f() // 3 を返します

例題 2​

ローカル変数を使用するフォーミュラの例:

$value:=10
$o:=New object("f";Formula($value))
$value:=20

$result:=$o.f() // 10 を返します

例題 3​

引数を用いたシンプルなフォーミュラの例:

$o:=New object("f";Formula($1+$2))
$result:=$o.f(10;20) // 30 を返します

例題 4​

引数を用いたプロジェクトメソッドを使用する例:

$o:=New object("f";Formula(myMethod))
$result:=$o.f("param1";"param2") // $result:=myMethod("param1";"param2") と同等です

例題 5​

This を使用する例:

$o:=New object("fullName";Formula(This.firstName+" "+This.lastName))
$o.firstName:="John"
$o.lastName:="Smith"
$result:=$o.fullName() // "John Smith" を返します

例題 6​

オブジェクト記法を使用してフォーミュラを呼び出す例:

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)

// フォーミュラをオブジェクトプロパティに設定します
$feta.calc:=$calc
$robot.calc:=$calc

// フォーミュラを呼び出します
$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​

履歴
リリース内容
17 R6名称変更 (New formula from string -> Formula from string)
17 R3追加

Formula from string( formulaString : Text ) : 4D.Function

引数型説明
formulaStringText->オブジェクトとして返されるフォーミュラ文字列
戻り値4D.Function<-フォーミュラを格納しているネイティブなオブジェクト

説明​

The Formula from string command creates a 4D.Function object based upon the formulaString. formulaString には単一の値のようにシンプルなものから、引数を持つプロジェクトメソッドのように複雑なものまで指定することができます。

This command is similar to Formula, except that it handles a text-based formula. In most cases, it is recommended to use the Formula command. Formula from string should only be used when the original formula was expressed as text (e.g., stored externally in a JSON file). このコンテキストにおいては、トークンシンタックスの使用が強く推奨されます。

ローカル変数の中身はコンパイル済みモードでは名前によるアクセスが不可能なため、 formulaString 引数内で使用することはできません。 Formula from string コマンドを使用してローカル変数にアクセスを試みた場合、エラー (-10737) が生成されます。 Formula from string コマンドを使用してローカル変数にアクセスを試みた場合、エラー (-10737) が生成されます。

例題​

以下のコードは、テキストフォーマットのフォーミュラを受け入れるダイアログを作成し、:

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

そのフォーミュラを実行します:

.apply()​

履歴
リリース内容
17 R3追加

.apply() : any
.apply( thisObj : Object { ; formulaParams : Collection } ) : any

引数型説明
thisObjObject->フォーミュラ内で This コマンドによって返されるオブジェクト
formulaParamsCollection->フォーミュラが実行される際に $1...$n として渡される値のコレクション
戻り値any<-フォーミュラの実行結果

説明​

.apply() 関数は、対象の Formula オブジェクトを実行し、その結果の値を返します。 Formula あるいは Formula from string コマンドで作成されたフォーミュラが使用可能です。 Formula あるいは Formula from string コマンドで作成されたフォーミュラが使用可能です。

thisObj には、フォーミュラ内で This として使用されるオブジェクトへの参照を渡すことができます。

任意の formulaParams 引数を渡すことで、フォーミュラ内で $1...$n の引数として使用されるコレクションを渡すこともできます。

.apply() は .call() と似ていますが、引数をコレクションとして渡す点が異なります。これは計算された結果を渡すのに便利です。

例題 1​

var $f : 4D.Function
$f:=Formula($1+$2+$3)

$c:=New collection(10;20;30)
$result:=$f.apply(Null;$c) // 60 を返します

例題 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()​

履歴
リリース内容
17 R3追加

.call() : any
.call( thisObj : Object { ; ...params : any } ) : any

引数型説明
thisObjObject->フォーミュラ内で This コマンドによって返されるオブジェクト
paramsany->フォーミュラが実行される際に $1...$n として渡される値
戻り値any<-フォーミュラの実行結果

説明​

.call() 関数は、対象の Formula オブジェクトを実行し、その結果の値を返します。 Formula あるいは Formula from string コマンドで作成されたフォーミュラが使用可能です。 Formula あるいは Formula from string コマンドで作成されたフォーミュラが使用可能です。

thisObj には、フォーミュラ内で This として使用されるオブジェクトへの参照を渡すことができます。

任意の params 引数を渡すことで、フォーミュラ内で $1...$n の引数として使用される値を渡すこともできます。

.call() は .apply() と似ていますが、引数を直接渡す点が異なります。

例題 1​

var $f : 4D.Function
$f:=Formula(Uppercase($1))
$result:=$f.call(Null;"hello") // "HELLO" を返します

例題 2​

$o:=New object("value";50)
$f:=Formula(This.value*2)
$result:=$f.call($o) // 100 を返します

.source​

履歴
リリース内容
18 R2追加

.source : Text

説明​

.source プロパティは、対象フォーミュラのテキスト型のソース式を格納します。

このプロパティは 読み取り専用 です。

例題​

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)"