v17R3:フォーミュラについて

早速触ってみました。
本来のオブジェクトっぽくなってきましたね。
すばらしい。 :smiley:

//define
$tools:=New object(
“iso8601”;New formula(String($1;ISO date GMT;$2));
“rect”;New formula(New object(“left”;$1;“top”;$2;“right”;$3;“bottom”;$4)))

//exec
$datetime_t:=$tools.iso8601(Current date();Current time())
$rect_o:=$tools.rect(10;12;23;48)

Storageに登録しようとしてみたのですができませんでした。
New shared formulaを待たないといけなさそうなのですが予定としてあるのでしょうか?

オブジェクト・プログラミングの拡張で予定されているものとしては,

オブジェクトのプロパティをコレクションとして取得すること
オブジェクトのプロパティ値をコレクションとして取得すること
オブジェクトのプロパティ値ペアをオブジェクトのコレクションとして取得すること
オブジェクト同士の等しさを判別すること
プロパティパスの最初の相違を取得すること
プロパティパスのすべての相違を取得すること
オブジェクトから共有オブジェクトのコピーを作成すること
コレクションから共有コレクションのコピーを作成すること
オブジェクトをコンストラクタとして新しいオブジェクトを作成すること
オブジェクトが特定のコンストラクタから作成されたことを判別すること
特定のコンストラクタが別のコンストラクタから継承されたものか判別すること

エンティティのもととなったデータクラスを取得すること
エンティティセレクションのもととなったデータクラスを取得すること
データクラスの基本情報を取得すること(内観)
データクラス属性の基本情報を取得すること(内観)
デフォルトデータストアの基本情報を取得すること(内観)

などが控えています。

New formula, Formula.call(), Formula.apply() については,
もともとの用途が下記のように想定されています。

デザインモードの検索と置換で容易に検出できるようなメソッドのポインターとして
4D View Proが非同期で呼びだせるような自由定義関数として
QUERY BY FORMULA, ORDER BY FORMULAと同等のことをORDAで実行する手段として
「ホストとコンポーネント間で共有する」メソッド属性の仕組みに依存することなく,コンポーネントから別のコンポーネントに属するプロジェクトメソッドをコールする手段として
コンポーネントに別のコンポーネントまたはホストのコンテキストで実行できるようなメソッドのポインターを渡すためのとして

JavaScriptの関数コールバックに着想を得たものであることが伺えると思います。

オブジェクトにフォーミュラを適用する場合,Thisはそのオブジェクトを指す,というのもJavaScriptに似ています。

引数のカッコなしでプロジェクトメソッドを渡すこともでき,その場合,JavaScriptのarguments的に任意数のパラメーターが受け取れます。

気をつけなければならないのは,フォーミュラを作成した時点で引数に変数を記述した場合,作成した時点で評価された変数の値が引数の値として固定(コピー)されるということです。(JavaScriptのように変数と同じシンタックスのパラメーター名があるわけではない)

共有フォーミュラ(New shared formula)はないのか,というご質問ですが,シンタックスは似ているとしても,New formula/object/collectionという「ファミリー」という発想があるわけではなく,用途も違うので,それは期待できないと思います。

文字列がStorageに入っていれば,New formula from stringで作成できるかと思いますが・・・

Storageにフォーミュラ(型はC_OBJECT)を登録することで,どんなことが実現できると期待されているのでしょうか。

色々予定されているのですね。楽しみです。

Storegeにフォーミュラを登録したい目的ですが、

Storege.Math.atan2:=New shared formula(Math_atan2($1;$2))
Storege.Math.atan:=New shared formula(atan($1))
Storege.Math.Num:=New shared formula(_Num($1))

などとメソッドとコマンドをまとめられないかと考えました。
javascriptのMath.atan2とかあるので同じ感覚でつかえたらいいかなと思ったので。

それで登録できるのか試してみたのですがダメでした。 :mrgreen:

よく使うコマンドやメソッドをライブラリ的にメソッドで扱える様にするには、Storegeに登録かなと…
希望ですがメソッドエディタでStorege.Math.と入力してTABキーを押すと登録した候補が出てくれるのとてもありがたいです。
現状のオブジェクト記法でオブジェクトの候補がでるルールがよくわかりません。最初は出なくてそのあと出てくるのですが
対象のオブジェクトのものではないものが出てきたりしますのでよくわからないんですよね。

あとThisコマンドなのですが、For each文でもつかえないでしょうか。JUGのフォーラムで触れましたが
スカラー値の場合の対策として、Thisコマンドなら対応できるのではないかと考えました。
こちらも試しては見たのですが現状ではNullが返ってきます。 :frowning:

追加の要望です。

1.JSON Stringifyコマンドで登録されているフォーミュラは書き出さない様にしてほしいです。

2.New objectで生成された時、
$object.remove:=New formula(OB REMOVE(This;$1))
$object.copy:=New formula(OB Copy(This;$1))
$object.export_json:=New formula(JSON Stringify(This))
こんな感じで最低限必要なものを自動的に登録してもらえないでしょうか?
個人的には拡張したいので、リソースフォルダかどこかに登録内容をJSON形式でカスタマイズできればと思います。

:pray:

コンパイルしてみたところ、New formulaで定義した$1などの引数がシンタックスエラーになる場合があるので調べてみました。 :mrgreen:

どうもNew formulaを記述しているメソッドのパラメータとして評価されているらしく型が一致しない場合にエラーになっている様です。
とりあえずNew formula from stringで回避はできるのですが、コンパイラとしては問題があると思います。

Path to objectを拡張してみました。
わずかなつくり込みでこんな感じでかけますね。

$path_o:=_Path_to_object (Get 4D folder(Current resources folder))
$path_o.append(New collection(“ja.lproj”;“MessagesJA.xlf”)).set(“charset”;“UTF-8”)
XML_t:=$path_o.loadText()

内容は、

1.リソースフォルダのパスオブジェクトを作る。
2.その下のファイルまでのパスを追加する、ファイルの文字コードを設定。
4.テキストとしてロードする。

です。
Path to objectもこんな感じで4D社側で拡張してくれると助かります。 :pray:

C_BLOB($1;$2)

$o:=New object(“f”;New formula($1+$2))
$result:=$o.f(10;20) // returns 30

C_REAL($result)

特に問題なくコンパイルできました。($1+$2はシンタックスエラーになるはず)

v17R3.228448

最新のビルドでも問題は再現されるのでしょうか。

その場合,問題を再現できるコードがあると調査の助けになると思います。

228996で確認しました。再現されました。

http://forums.4d.com/4DBB_Main/x_User/1337704/files/27018313.zip

ドットノーテーションでプロパティ名やメソッド名が表示される条件ですが,
現状,新インタープリター(ASTインタープリター)がまだ開発中なので,実装は限定的です。

表示されるのは「セッション中に入力したもの(打ち間違いを含む)すべて」で,
dsオブジェクトについてはフィールド名が候補として表示されますが,
データストアは起動時に1度ロードされるだけですので,
追加・リネームは反映されません。

ASTがオブジェクトの抽象シンタックスツリーを構築するレベルに達すれば,
クラスが継承しているプロパティだけが表示されるようになります。

ASTインタープリターの開発は,長期的なプロジェクトで,
BISON文法でランゲージの構文をきちんと定義すること(16R4)に始まり,

どんな式でも正しく評価できること,
インタープリターモードでデバッグできること,
SQLに対応すること,
外部コードエディター用のプラグインモジュールとして分離すること,
演算子の順番を「標準」にすること,
余分な条件式を評価しないこと

など,パーサーや再帰的インタープリターの包括的なリファクタリンクが含まれています。

「New objectで自動的にメソッドを追加する」ことができれば,
当面の目標は果たせるかもしれませんが,
カンファレンスでも言及されていたように,
「自分で定義したクラスのインスタンスが作成できるようにする」方向で開発が進んでいますので,
急ぐのであれば,そのような「メソッド付き」のオブジェクトを返すコンポーネントメソッドを作成しておき,
標準コマンドでそれができるようになったときに置き換えられるような計画で臨むのが良いと思います。

JSON Stringifyで[object picture]や[object formula]が書き出される,
あるいはWrite Pro, View Pro, 時間, 日付, ポインターなど ,
プロパティの中身に応じて違う形式の「説明的な文字列が出力される」のは,
オブジェクト言語の標準的なStringifyメソッド(またはdescriptionプロパティ)の振る舞いに沿っているものですので,
これを変えることは難しいと思います。

自分でオブジェクトのクラスを定義できるようになったとき,
stringifyメソッドをオーバーライド(ポリモーフィズム)できれば良いのかもしれませんが・・・

: Keisuke MIYAKO

ドットノーテーションでプロパティ名やメソッド名が表示される条件ですが,
現状,新インタープリター(ASTインタープリター)がまだ開発中なので,実装は限定的です。

デベコンでのデモとか見たので状況は察します。 :slight_smile:

メソッドエディタでドットノーテーションでプロパティやメソッド名が表示されるのって意外にあるのとないのとでは書きやすさが違うんですよね。
特にVisual stadioとか触っていると痛感するんです。ぜひ実装をお願いしたいです。 :pray:

コレクション型のリストボックスThis.valueみたいな感じでしょうか。

http://doc.4d.com/4Dv17/4D/17/This.301-3776566.ja.html

コチラに転送しました。

http://forums.4d.com/Post//26781425/1/

現状は,map() または reduce() で代用でしょうか。

http://doc.4d.com/4Dv17/4D/17/collectionmap.301-3730943.ja.html

http://doc.4d.com/4Dv17/4D/17/collectionreduce.301-3730953.ja.html

: Keisuke MIYAKO


「自分で定義したクラスのインスタンスが作成できるようにする」方向で開発が進んでいますので,
急ぐのであれば,そのような「メソッド付き」のオブジェクトを返すコンポーネントメソッドを作成しておき,
標準コマンドでそれができるようになったときに置き換えられるような計画で臨むのが良いと思います。

JSON Stringifyで[object picture]や[object formula]が書き出される,
あるいはWrite Pro, View Pro, 時間, 日付, ポインターなど ,
プロパティの中身に応じて違う形式の「説明的な文字列が出力される」のは,
オブジェクト言語の標準的なStringifyメソッド(またはdescriptionプロパティ)の振る舞いに沿っているものですので,
これを変えることは難しいと思います。

こちらも開発中なので仕方ないとして、
基本的なものってあると思うのでコンポーネントでもよいので4D側で用意すればどうでしょうか?と考えます。
基本的なものってだいたい誰が作っても同じなので、各デベロッパーやエンドユーザが個別に作るより効率的だと思います。

JSON Stringifyについては、ORDA側とか今後実装されるSQL対応などで不都合が生じる可能性がたかいのでJSONに変換できないものは除外するなど
考慮してもらえるとありがたいです。

現状のR3でも Value type コマンドでフォーミュラを見分ける様にはできていないみたいなので、こちらで対応しようにもちょっと面倒です。 :frowning:
Is pictureはあるので、Is fomuraはないですよね。

JSON Parseについても4Dでいうところのlog64とfloat型のデータが外部からきた場合対処がむずかしいのですが、変数で扱える様になる対応予定はないでしょうか?
ORDAのデータクラスにあるfromCollectionメンバ関数などでも困ると思います。

: Keisuke MIYAKO

コレクション型のリストボックスThis.valueみたいな感じでしょうか。

http://doc.4d.com/4Dv17/4D/17/This.301-3776566.ja.html

コチラに転送しました。

http://forums.4d.com/Post//26781425/1/

転送ありがとうございます。
無理なのであれば、せめて配列要素の何番目か拾える様にしてほしいです。 :pray:

カンファレンスで使用したスライドの原文にあった記述ですが,
For eachを作成したのは,4Dに慣れたデベロッパが
「1からlengthまで」コレクション型を処理しようとする,
という「うっかりミス」をするのを防ぐため
,だそうです。
(半分,冗談なのかもしれませんが・・・)

フォーミュラの場合,.apply() も使えそうです。

わかったような気がします。

この場合,

フォーミュラ部

C_LONGINT($1;$2)
C_OBJECT($0)

$0:=New formula(Substring(This.value;$1;$2))

とオブジェクト部

C_TEXT($1)
C_OBJECT($0;$string_o)

$string_o:=New object(“value”;$1)

$string_o.substring:=f_substring

$0:=$string_o

または

C_TEXT($1)
C_OBJECT($0;$string_o)

$string_o:=New object(“value”;$1;“substring”;f_substring )

$0:=$string_o

を分離すれば良い(というか,そうする必要がある)のではないでしょうか。

http://forums.4d.com/4DBB_Main/x_User/298210/files/27018944.zip

$1の件ですが,バグ(ACI0098938)として登録され,即日,修正されました。

http://forums.4d.com/Post/FR/26781425/1/27020561#27020561

: Keisuke MIYAKO

$1の件ですが,バグ(ACI0098938)として登録され,即日,修正されました。

http://forums.4d.com/Post/FR/26781425/1/27020561#27020561

宮古さんナイスです(´꒳`)b✨

: Keisuke MIYAKO
$1の件ですが,バグ(ACI0098938)として登録され,即日,修正されました。

http://forums.4d.com/Post/FR/26781425/1/27020561#27020561

修正のご連絡からだいぶたったので、229659で確認してみたのですがまだ直っていない様です。 どのバージョンから対応なのでしょうか? :-(