問題タブ [dwscript]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
370 参照

delphi - DWScript: Delphi 側からメタ クラス パラメータを読み取る方法

DWScript でのメタ クラスの使用に問題があります。

スクリプトを使用して、VAR とエンド ユーザーがアプリケーションをカスタマイズできるようにしています。

私たちのアプリケーション データは、基本的にツリー構造の小さなオブジェクトで構成されています。各オブジェクトは、データを表示するだけの「ダム」であるか、または何らかの方法でインテリジェントである可能性があります。インテリジェンスは、さまざまなスクリプト クラスをツリ​​ー オブジェクトに関連付けることにより、スクリプトで実装されます。

私が抱えている問題は、オブジェクトを実装するためにどのスクリプト クラスを使用する必要があるかを、スクリプトが Delphi サイド フレームワークに伝える必要があることです。基本的には、スクリプト メタ クラスを Delphi 側に渡し、そこに情報を安全に永続化できる形式で保存する必要があります (型名で、おそらく文字列として)。また、逆方向に移動できるようにする必要があります。つまり、メタ クラスを Delphi 側からスクリプトに返します。

TdwsUnit 宣言

スクリプト

Delphi の実装

メタクラスの宣言、TItemClass. で完了TdwsUnit.OnAfterInitUnitTable

RegisterItemClass実装

問題は、メタ クラス パラメータから TSymbol を取得する方法です。
編集:この古い質問で、問題の一部に対する答えを見つけました。
要するに、解決策は、パラメーター値を a にキャストすることですTSymbol

でも...

クラス名を文字列として保存するとします。このクラス名からシンボルに戻すにはどうすればよいですか? これが必要な理由は、スクリプトが (上記のコードを使用して) アイテム クラスを設定できるのと同様に、スクリプトがアイテムのクラスを要求することもできるからです。

必要なことを行うと思われる4つの異なる方法のいずれかを使用してシンボルテーブルを調べてみましたが、いずれもシンボルを見つけることができません。

問題は、スクリプトで宣言されたメタ クラスの名前が与えられた場合、Delphi 側から対応する TSymbol を取得するにはどうすればよいかということです。

編集:最後の部分に対する1つの可能な解決策を見つけました。

以下はうまくいくようですが、それが正しい方法であるかどうかはわかりません。シンボル検索の範囲を現在のスクリプト ユニットに限定する必要があると考えたでしょう。

0 投票する
1 に答える
283 参照

dwscript - DWScript 単純なテキスト ファイルの書き込み/読み取り

dwscript を使用して単純なテキスト ファイルを読み書きしたいと考えています。私のコードは以下にあります...しかし、私はそれを実行することができません.誰かが助けてください...:

0 投票する
1 に答える
137 参照

delphi - DWSWebServer でスクリプト RTTI を使用する

現時点では、DWSWebServer で少し遊んでいます。Pascal スタイルの言語で動的な Web サイトをコーディングするというアイデアがとても気に入っています。ここで、script-side-RTTI を使用して単純な ORM を実装したいと思います。しかし、スクリプト コンパイラは RTTI 関数またはクラスを認識しません。

たとえば、次のコードを試してみると:

私は手に入れます:

Web サーバーの最新バージョンを正常にコンパイルしましたが、RTTI をサポートするために必要なオプションやライブラリがありませんか?

ご協力いただきありがとうございます

0 投票する
1 に答える
210 参照

delphi - DWScript、Monkey Patching: 実行時にメソッドまたはプロパティを追加

現在、DWScript + SQLite の ORM マッピングを作成しています。通常のプロパティ (文字列や整数など) のマッピングを正常に実装しましたが、外部キー多対多の関係を追加したいと考えています。このために、クラス A で外部キープロパティを宣言し、実行時にクラス B に関係マネージャーを追加して、関係をモデル化することを計画しました。ソースコードのクラス B に関係マネージャーを配置できることはわかっていますが、フレームワークで宣言されたユーザー モデルへの外部キーを持つモデルがアプリケーションにあると想像してください。新しいアプリケーションごとにフレームワークを変更するのは現実的ではありません。

私の質問: スクリプトの実行時に新しいプロパティ、フィールド、または関数をオブジェクト/クラスに追加するにはどうすればよいですか?

説明するためのコードを次に示します。

0 投票する
3 に答える
319 参照

delphi - Record であるプロパティの DWScript セッター

私の問題は非常に単純です。私はこのコードを持つ dwsUnit を持っています:

mc.Position.X (または Position.Y または Z) で次を取得します。

これはどういう意味ですか?がプロパティの場合、レコードは読み取り専用ですか? そして、Delphi 側からアクセスする方法。(2番目の問題、それほど大したことではありません)

0 投票する
0 に答える
249 参照

delphi - マジック関数からオブジェクトを渡す

dwscript で TStringList を使用する必要があります。

コンパイルされた Delphi コードでは、両方を使用します

ここで、genSL は TStringList を作成して入力します。

これを dwscript で使用したいのですが、genSL から TStringList を返すのに問題があります。

どうやら2つのアプローチがあるようです。

1 RTTI を使用

デルファイで私は書く

そしてコールバックで

これにより、外部で作成された TStringList をスクリプトに渡すことができます。

問題:スクリプトで、リストを RTTIVariant として宣言する必要があります。

実際には TStringList であるため、これは誤解を招きます (また、既存のコードを変更せずに使用したいと考えています)。スクリプトで List を TStringList として宣言することをお勧めします。

2 TStringList を dwsUnit に公開する

デルファイで私は書く

スクリプトでは、TStringList を作成して使用できます。

しかし、TStringList-y を返す魔法の関数を宣言することはできません。

デルファイ コード:

およびスクリプトコード:

問題:これにより、スクリプトのコンパイルがSyntax Error: Incompatible types: Cannot assign "TStringList" to "TStringList"で中止されます

私は何かが欠けていると思います。どちらにも必要なもの

  • オブジェクトを RTTIVariant 以外のものとして宣言して、オブジェクトをそれに渡します

また

  • スクリプトに渡せるように型を導入しますか?

私は2013年7月にチェックアウトされたdwscript-svnでDelphi 2010を使用しています(最近のsvnはd2010でコンパイルされませんでした)。任意の提案をいただければ幸いです。

0 投票する
3 に答える
1103 参照

json - マルチスレッドのメモリ割り当て/割り当て解除が集中するアプリケーションがスレッド数に応じてスケーリングしないのはなぜですか?

知らせ:

元の投稿タイトル

DWScript のマルチスレッド JSON パーサーがスレッド数に応じて拡張されないのはなぜですか?

この問題はDWScript を使用した JSON データの処理に関連していないため、変更されました。問題は、Delphi XE2 から XE7 (テストは XE2 と試用版 XE7 ) のデフォルトのメモリ マネージャーにありますが、このようなアプリケーションで最初に問題が発生しました。


Delphi XE2 で JSON データを処理するマルチスレッドの Win32/Win64 vcl アプリケーションがあります。

各スレッドは、DWScript を使用して JSON データを解析しTdwsJSONValue.ParseString(sJSON)、DWScript メソッドを使用して値を読み取り、結果をレコードとして保存します。

テスト目的で、各スレッドで同じ JSON データを処理します。

単一スレッドの実行ではN、スレッド内でデータを処理するのに数秒かかります。スレッド数を線形にM増やすと (約M * N)、単一スレッド内で同じデータを処理するのに必要な時間が増加します。

その結果、速度の向上はありません。このアプリケーションの他の部分 (JSON データ配信、ターゲット環境への結果の保存) - 期待どおりにスケーリングします。

理由は何ですか?どんなアイデアでも大歓迎です。

補足情報:

  1. Win7/32 および Win7/64、Win8/64 の 2 コアから 12 コア (HT なし) システムでテスト済み

  2. DWScript が利用可能な最速のものとして選択されました (その中には Superobject、組み込みの Delphi などをテストしました)。SO は、DWS の JSON ユニットと同様に動作します。

  3. 以下は、問題を示す完全なコンソール アプリです。これを実行するには、 https ://www.dropbox.com/s/4iuv87ytpcdugk6/json1.zip?dl=0 で入手できるサンプル json データが必要です。このファイルにはjson1.dat、最初のスレッドのデータが含まれています。スレッド数が 16 までの場合は、json1.dat を json2.dat...json16.dat にコピーするだけです。

    プログラムとデータは同じフォルダにある必要があります。実行するには: convert.exe N (N はスレッド数)。

    プログラムは実行時間 (ミリ秒単位) を stout に書き込みます - スレッドで費やされた時間、データの解析時間、TdwsJSONValue オブジェクトの解放 (破棄) 時間。ステートメント_dwsjvData.Destroy;はスケーリングしません。


0 投票する
1 に答える
420 参照

delphi - DWScript: IScriptObj から IInfo または TProgramInfo への取得

参照が与えられた場合、対応するorIScriptObjにどのように到達しますか?IInfoTProgramInfo


Delphi オブジェクトをラップするスクリプト オブジェクトがあります。

スクリプト オブジェクトの存続期間を管理するために、Delphi オブジェクトはスクリプト オブジェクトへの参照を格納します。Script オブジェクトはTdwsUnitコンポーネントで宣言されます。それはかなり標準的で、次のようになります。

デルファイ

脚本

Delphi オブジェクトのインスタンス化と Delphi/スクリプト リンクの設定は、スクリプト オブジェクト コンストラクタの Delphi 実装で行われます。また、かなり標準的です:

デルファイ

理想的には、後で必要なすべてを実行するのではなく、参照を保存したはずですが、経験から、オブジェクトIInfoはメソッド呼び出しの間のみ有効であるようです。IScriptObjIInfoIInfo

とにかく、TDelphiObject.DoSomethingDelphi 側で が呼び出されたときに問題が発生します。 TDelphiObject.DoSomethingスクリプト オブジェクトで対応する仮想メソッドを呼び出すためのものです。

デルファイ


IInfo使用可能なものを取得するため、またはTProgramInfo保存されたものを取得するためにさまざまな手法を試しましたIScriptObjが、すべてが失敗しました。それで、これを行う正しい方法は何ですか?