SSブログ

callcnt unbindres 対応(v2.0.44.0) [資産管理電卓(LineCalc)]

資産管理電卓 v2.0.44.0 で以下の機能対応不具合修正を行いました。

・callcnt の対応
・unbindres の対応
・稀に中断メッセージが出ない不具合対応
・prc GC デッドロック対応
・帰り値一時変数並列対応
・入れ子帰り値一時変数対応
・cpdim自己thisコピー先参照対応
・ref対応
・cpycnt を cpcnt に変更(cpdim に合わせる)
・cpcntコンテキストリソースバインド漏れ対応

 callcnt は関数呼び出し元の変数郡(コンテキスト)にアクセスするための内部関数で
コンテキストリソースとして機能します。
 ガベージコレクタ対応で対応不能となっていましたが、複数の値を高速に返したりできるのでなんとか復活させました。
 使い方は callcnt.変数名 で呼び出し元の変数(関数)にアクセスできます。
 作成も可能です。

{
 fnc(tes,
  {
   sum = 0, 
   for(cnt, 1, 100, 1,
    {
     v = cnt * cnt, 
     sum = sum + v, 
     callcnt.(@1)[cnt] = v // 呼び出し元の配列変数に値を格納して返す
    }
   ),
   callcnt.(@2) = sum // 呼び出し元の変数に値を返す
  }
 ), 
 tes(^tmp, ^sum), 
 ford(tag, tmp, {lprint(tmp[tag] & ":")}), 
 lprint(sum)
}

上記では関数 tes は引数として出力先変数名を受けてその変数に値を返しています。
C# の in , out , ref 引数に相当する機能が実現できます。

・unbindresの対応
unbindres も対応しました。
unbindres ではバインドの解除だけでバインドされているリソースの削除は行われません(既にバインドされた変数のどれかが削除済みのものはガベージコレクタの対象になります)。
context,stringbuffer については作成時にデフォルトでシステム変数にバインドされ関数終了時に削除されます。

callcnt,unbindres を実装したので v2 系の v1 との非互換性は context,stringbuffer で bindres が必要なくなり、= 代入でバインドされ、バインドされない場合は関数終了時に消去されることと cpycnt が cpcnt に変更になったことです。
context,stringbufferについてはリソース管理は必要なくなりましたが、明示的に bindres を適用することもでき今までのソースはそのまま動作します。

{
 bindres(ctx,context), 
 bindres(stb,stringbuffer) 
}

上記の記述は、

{
 ctx = context, 
 stb = stringbuffer
}


代入だけで済むようになりました。今まで通りの記述も可能です。

リソースIDを変数に入れず文字列として管理したり、リソースを作って変数を介さず数値を人が確認して手作業で管理しているような特殊な場合以外は互換性は保たれます。

プログラム終了後も context,stringbuffer リソースを残したい(全体で使うクラス等)はグローバル変数に入れておけば残すことができます(アプリを終了すると消えます)。

・cpdim自己thisコピー先参照対応
cpcnt,cpdim では自己 this はコピー先を参照するように対応しました。
関数や配列の代入でのコピーではコピー元のコンテキストが参照されます。

{
 ctx = context,
 ctx2 = context,
 fnc(ctx.fn[0],{this.yaa}),
 ctx.yaa = 123,
 ctx2.fn = ctx.fn, // 代入では ctx2.fn の this は ctx を参照
 ctx2.yaa = 321,
 lprint(ctx2.fn[0] & ":"), // 123

 cpdim(ctx.fn,ctx2.fn), // cpdim ではコピー先参照
 lprint(ctx2.fn[0] & ":"), // 321

 ctx2 = cpycnt(ctx), // cpcnt ではコピー先参照
 ctx2.yaa = 321, 
 lprint(ctx2.fn[0]), // 321
}


123:321:321 と表示されます。

・ref対応
関数定義の変数でも評価せず文字列として定義内容を返します。
{
 fnc(tes,{123}),
 delfile("tes.txt"),
 fprint("tes.txt",ref(tes)), // tes の定義内容をファイル tes.txt に保存
 def(tes2,fload("tes.txt")), // ファイル tes.txt を読み込み tes2 を定義
 tes2
}

クロージャやthisの参照は削除されますが簡便に関数や変数をファイルに保存できます。
関数文字列は def で関数に登録します。

{
 tmp = [1, 2],
 fnc(tmp[2],123), 
 delfile("tes.txt"), 
 fprint("tes.txt", ref(tmp)),  // 配列 tmp の代入可能な文字列を得る
 tmp2 = fload("tes.txt"), // 配列をファイルから読み込み設定
 tmp2[2]
}

配列に対しては変数に直接代入できる文字列が返されます。
クロージャやthisの参照は削除されますが簡便に配列全体をファイルに保存、復元する場合に使用できます。

コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。