SSブログ

クラス作成補助内部関数等作成(v2.0.25.0) [資産管理電卓(LineCalc)]

資産管理電卓 v2.0.25.0 で以下の機能対応を行いました。

・合成IDから無名関数を得る lambda 内部関数対応
・クラス作成補助内部関数 class 作成
・代入なしコンテキスト削除対応

・合成IDから無名関数を得る lambda 内部関数対応
ローカル変数の合成関数に # をつけて無名関数を得ることができていませんでしたので lambda 内部関数を作成しました。

{
 vn = "tmp",
 fnc((vn & "1"),123), // () でくくって合成IDを作成して関数定義
 fn = lambda((vn & "1")), // 合成IDから無名関数を得る
 fn
}


コンテキストリソースの関数は # で無名関数を得られます。

{
 ctx = context,
 fnc(ctx.("tmp"),123),
 fn = #ctx.("tmp"),
 fn
}


・クラス作成補助内部関数 class 作成
コンテキストリソースを使ってクラスを作成できますが、記載が煩雑なのでクラス定義内部関数 class を作成しました。

{
 fnc(newCTes, // CTes クラス作成 new 関数定義
  {
   cls = context, // インスタンス作成
   cls.foo = 123, // クラス変数定義
   fnc(cls.fn,lprint(this.foo)), // クラス関数定義
   cls // インスタンスを返す
  }
 ),
 cl = newCTes,
 cl.fn
}


これは class 内部関数を使うと
{
 class(CTes, // CTes クラス定義
  {
   cls.foo = 123, // クラス変数定義
   fnc(cls.fn,lprint(this.foo)), // クラス関数定義
  }
 ),
 cl = newCTes,
 cl.fn
}

上記で記載可能です。クラスメンバは cls.メンバ として記載してください。
定義式は自由に記載可能です。
クラス作成関数は自動で new が追加され定義されます。

{
 ctx = context, 
 class(ctx.CTesBase, // ベースクラス
  {
   cls.foo = 123, 
   fnc(cls.fn, lprint(this.foo))
  }
 ), 
 class(ctx.CTes, 
  {
   cls = this.newCTesBase, // ベースクラス作成以下オーバーライド
   cls.yaa = 321, 
   fnc(cls.fn, lprint(this.foo & ":" & this.yaa))
  }
 ), 
 cl = ctx.newCTes, 
 cl.fn
}

上記ではクラスの継承を行っています。
トップにコンテキストを入れないと他のクラスにアクセスできないので統括するメインクラスを導入すると

{
 class(CMain, 
  {
   class(cls.CTesBase, 
    {
     cls.foo = 123, 
     fnc(cls.fn, lprint(this.foo))
    }
   ), 
   class(cls.CTes, 
    {
     cls = this.newCTesBase, 
     cls.yaa = 321, 
     fnc(cls.fn, lprint(this.foo & ":" & this.yaa))
    }
   ), 
   fnc(cls.main, 
    {
     cl = this.newCTes, 
     cl.fn
    }
   )
  }
 ), 
 cl = newCMain, 
 cl.main
}

上記になります。

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

クロージャの完全対応等(v2.0.23.0) [資産管理電卓(LineCalc)]

資産管理電卓 v2.0.23.0 で以下の機能対応バグフィックスを行いました。

・クロージャの完全な対応。
・リソースの複数バインド対応。
・callcnt,unbindres の削除、cmp,cmpval,cmpstr の追加
・最後に0が入る数値の比較不具合修正
・比較演算子の文字列演算指定 & に対応
・grph コマンドで負数のインデックスに対応
・grph コマンドでインデックスの数値、文字判定を厳密化
・grph コマンドで1つでも文字インデックスがあれば全て文字インデックスとみなす対応
・無名関数を含む配列のコピー対応
・関数配列帰り値()無指定呼び出し対応
・配列変数の帰り値無名関数対応
・関数代入でのthisを元コンテキストに固定
・setcomで変数配列が両方あった場合同時設定対応
・cpdim,mgdim無名関数対応
・isbind閉じカッコ抜け対応
・無名関数を含む配列 = 代入でのデフォルトthisコピー参照対応
・バインド変数代入でバインド対応
・context,stringbuffer,jxon,xml,cpycnt 代入だけでバインド対応
・prc 作成直後に削除すると中断されない不具合修正
・dbgでコンテキストリソースの内容が表示されない不具合修正
・F1補完でコンテキストリソースの内容が出ない不具合修正
・F1補完で非定義変数のコンテキストドット補完をすると落ちる不具合修正
・コンテキスト配列とローカル配列代入エラーデグレード修正

今回コンテキスト(変数領域)とリソース管理にガベージコレクタが導入されました。
それに伴いcallcnt,unbindres が削除され bindres の動作が変更になっています。
互換性に問題が出るためメジャーバージョンを上げました。

・クロージャの完全な対応
今までも簡易的なクロージャに対応していました。
{
 fnc(dosome,
  {
   prc("{delay(1000)/*do something*/,@1}",#@1)
  }
 ),
 tmp = 123,
 v = dosome(=>{lprint(tmp)}),
 v2 = dosome(=>{lprint(tmp * 2)}),
 waitres(v,v2)
}

上記のように非同期実行後コールバックを行う dosome 関数の定義で、無名関数を使ってコールバックを引数で渡す場合、 v,v2 に PRC リソースの ID を得て待つ必要がありました。
そうしないと、dosome を呼び出した関数終了時に tmp 変数が消去されてしまい並列処理が終わった段階で呼び出しても変数にアクセスできませんでした。
また、dosome 内の prc にコールバック関数(@1)を渡す際には prc の引数にしないと dosome 関数を出た時に dosome 内で定義された変数が消去されるためにアクセスできませんでした。
無名関数で外部変数をアクセスし非同期処理や関数を返す場合、変数生存管理が必要でコードが煩雑になり不便でした。

今回完全にクロージャに対応したので以下のように記載できるようになりました。
{
 fnc(dosome,
  {
   fn = #@1,
   prc(=>{delay(1000)/*do something*/,fn})
  }
 ),
 tmp = 123,
 dosome(=>{lprint(tmp)}),
 dosome(=>{lprint(tmp * 2)}),
}

変数への参照がある限り参照された変数が定義されているコンテキスト(変数定義領域)は残り続けるようになり、関数が終了しても参照されている変数が残り続けますので、変数がいつ消えるか考えながらプログラムする必要が無くなり、コードが簡潔に記載できるようになりました。

参照されているコンテキストが保持されるため以下のような記載も可能です。
{
 fnc(tes,{ tmp = 0,=>{tmp = tmp + 1} }),
 fn = tes,
 lprint(fn()),
 lprint(fn())
}

上記は 12 と表示されます。
関数 tes の中の変数 tmp は tes 内の無名関数により拘束され tes から返される無名関数を保存している変数がある限り保持され 1 , 2 と前回の値に 1 が足されていきます。

・リソースの複数バインド対応
リソースに bindres で複数の変数にバインドできるようになりました。
リソースは作成するとグローバルに作成されるので消すには管理が必要です。
{
 ctx = context,
 ctx.foo = 123,
 lprint(ctx.foo),
 delres(ctx)
}

これだと消し忘れも多いため、bindres で変数にバインドすると変数消去とともにリソースも消去されます。
{
 bindres(ctx,context),
 ctx.foo = 123,
 lprint(ctx.foo),
}

今まではリソースは1変数にしかバインドできませんでしたが、複数の変数にバインドできるようになりました。
{
 bindres(ctx, context), 
 ctx.yaa = 123, 
 fnc(tes, { bindres(ctx2, @1), lprint(ctx2.yaa) }), 
 tes(ctx)
}

上記では関数 tes に渡したコンテキストリソースIDを tes 内でさらにバインドしています。
tes が終了した時点で tes の ctx2変数は消去されバインドは解除されますが、もう一つバインドされているためリソースは削除されず変数 ctx が削除された後に削除されます。

{
 bindres(ctx, context), 
 ctx.yaa = 123, 
 fnc(tes, { bindres(ctx2, @1), prc(=>{delay(1000), lprint(ctx2.yaa)})}), 
 tes(ctx)
}

上記では関数 tes 内で ctx2 にリソースがバインドされ prc 内の無名関数 =>{} に関数 tes の変数が拘束されます。prc 内で ctx2 を使用後 ctx2 が削除されリソースが削除されます。

bindres はリソース1つに対して行われコンテキストリソース内のコンテキストリソースによるツリー構造に対応するには、参照先コンテキストリソースをバインドでコンテキストリソース内変数に保持しておく必要があります。

{
 bindres(ctx, context), 
 bindres(ctx.ctx2, context), 
 bindres(ctx.ctx2.ctx3, ctx) 
}

上記のような自己参照を含むループ構造もガベージコレクタにより削除されます。

バインドした変数を他の変数に代入すると代入先の変数もバインドされます。
{
 bindres(ctx,context),
 ctx2 = ctx // ctx2 は ctx のリソースにバインドされる
}


関数の帰り値としてバインドしたコンテキスト変数を返すと、呼び出し元では帰ってきたリソースの破棄は必要なくなります。

{
 fnc(tes, {bindres(ctx, context), ctx.foo = 123, ctx}),  // ctx はバインドされ帰り値として返される
 ctx2 = tes,  // ctx2 は帰り値のリソースにバインドされるのでリソース破棄必要なし
 lprint(ctx2.foo),
 lprint(tes.foo) // これでもOK
}


bindres で一度変数にバインドしておけば参照がなくなればガベージコレクタにより破棄されるためリソース破棄管理は必要なくなります。

context,stringbuffer は代入だけでもバインドされるようにしました。
bindres を書かなくても変数に代入しておけばリソース管理は必要なくなりました。
web,grph は関数終了後も表示を続けたい場合があるので明示的なバインドでの管理を必要としています。
prc は実行が終われば削除されます。

{
 ctx = context, // 代入だけでバインドされる
 ctx.foo = 123,
 lprint(ctx.foo)
}


delres はリソースを強制的に削除します。
リソース内でバインドされた変数は変数削除と同じ動作が行われます。

callcnt , unbindres は廃止されました。

・cmp,cmpval,cmpstr 追加
演算子 >,<,>=,>=,==,!= は文字列か数値かを自動判定します。
"105.5a" == 105.5 は 1 が返ります。
そうではなく、自動判定、数値、文字列を選択して比較する関数 cmp,cmpval,cmpstr を作成しました。

・最後に0が入る数値の比較不具合修正
"150.50" == 150.5 は "150.50" が文字列と誤判断されていて 0 が返っていました。
最後に0が入っても数値と判定するようにしました。
数値の最後に文字列が入っても数値と判定されます。
"150.50a" == 150.5 は1が返ります。

・比較演算子の文字列演算指定 &
比較演算子の後ろに "&"をつけると文字列比較になるようにしました。
"150.50a" ==& 150.5 は0が返ります。
"150.50a" == 150.5 は1が返ります。

・grph コマンドで負数のインデックスに対応
{
 tmp = [0::1, -24::3],
 grph(tmp)
}

上記のような負数のインデックスのグラフのインデックスのソートが正常に行われず -24 が文字列ラベルと判定されていたのを修正しました。

・grph コマンドでインデックスの数値、文字判定を厳密化しました。
・grph コマンドで1つでも文字インデックスがあれば全て文字インデックスとしました。
grph コマンドで数値、文字判定をLCSの計算と同一にしました。数値の後に文字列が続いても数値と判定されます。
今までインデックスは数値、文字が混在するとグラフが崩れていましたが1つでも文字があると全て文字とするようにしてグラフが崩れないようにしました。

・無名関数を含む配列のコピー対応
配列に無名関数が含まれていた場合コピーすると参照が反映されていなかったのを修正しました。
{
 foo = 123, 
 tmp = [=>{lprint(foo)}], 
 tmp2 = tmp, 
 tmp2[0]
}


・関数配列帰り値()無指定呼び出し対応
関数で帰り値に無名関数の配列が返った場合 () を指定しなくても呼び出すようにしました。
{
 foo = 123, 
 tes = =>{ [=>{lprint(foo)}] }, 
 tes()[0] // 最後に() 必要なし
}


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

資産管理電卓(LineCalc)V1.2.84.0公開 [資産管理電卓(LineCalc)]

資産管理電卓(LineCalc)V1.2.84.0を公開しました。

https://linecalc.blog.ss-blog.jp/LineCalcDownload

・配列エディタで複数行、長い文字列に対応しました
・配列エディタで落ちる不具合対応
・配列エディタメモリリーク対応
・配列エディタ参照、関数保存対応
・配列エディタ参照、関数変更対応
・配列エディタキーコマンド対応

資産管理電卓 v1.2.84.0 の説明は以上です。

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

資産管理電卓(LineCalc)V1.2.76.0公開 [資産管理電卓(LineCalc)]

資産管理電卓(LineCalc)V1.2.76.0を公開しました。

https://linecalc.blog.ss-blog.jp/LineCalcDownload

・web,net でのデフォルト UserAgent 指定対応
・net(^html)でUserAgent指定対応
・setuseragent,getuseragent,setbasicauth対応
・net を使用するとソケットを大量消費する問題点修正
・ライブラリ更新

web,net コマンドで UserAgnet のデフォルト指定、コマンド毎指定ができるようになりました。
デフォルトの UserAgent は 設定->ユーザーエージェント指定 から行います。
net コマンドでソケットを大量消費する不具合を修正しました。
UserAgent ごとに HttpClient を使い回すようにしました。

資産管理電卓 v1.2.76.0 の説明は以上です。

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

新コロナ感染データをグラフ化して検証 [雑記]

新型コロナがまた猛威を振るってしまっています。
私もワクチンはもう3回打ちました。

現状コロナの感染者数はネットやマスコミからは感染者数が主に報道されていて陽性者10万人を超えて大変なことだということはわかります。

政府のデータがあったので資産管理電卓でグラフ化して今どのような状況かわからないか見てみることにしました。

10万人の具体的なデータとしては PCR 検査ありきであり、PCR検査が母数にならないと正確な感染状況はわからないと思います。
そこで感染者数ではなく、PCR検査した中で感染者が出た割合(陽性率と呼びます)、重症者数、死者数をグラフ化してみます。

ソースは、

{
 bindres(ctx,json('{"items":' & net(^html,"https://data.corona.go.jp/converted-json/covid19japan-npatients.json") & '}')),
 fordim(tag,ctx.items,
  (
   adpatients[datetime(ctx.items[tag].date)] = ctx.items[tag].adpatients
  )
 ),
 setcom(adpatients,"日ごと陽性者数"),
 aline(adpatientsaline,adpatients,7*24*60*60),
 setcom(adpatientsaline,"陽性者数7日平均"),

 bindres(ctx,json('{"items":' & net(^html,"https://data.corona.go.jp/converted-json/covid19japan-ndeaths.json") & '}')),
 pretag = "",
 fordim(tag,ctx.items,
  (
   ndeaths[datetime(ctx.items[tag].date)] = ctx.items[tag].ndeaths,
   if(pretag != "" , deaths[datetime(ctx.items[tag].date)] = ndeaths[datetime(ctx.items[tag].date)] - ndeaths[pretag]),
   pretag = datetime(ctx.items[tag].date)
  )
 ),

 aline(deathsaline,deaths,7*24*60*60),
 setcom(ndeaths,"累積の死亡者数"),
 setcom(deathsaline,"日ごと累積の死亡者7日平均"),
 setcom(deaths,"日ごと累積の死亡者数"),

 // PCR 検査数
 // PCR検査数をネットから取得
 dat = net(^html, @"https://www.mhlw.go.jp/content/pcr_tested_daily.csv"), 

 // 日付と検査数の配列を作る
 split(dat2, dat, @"\n"), 
 for(cnt, 1, len(dat2) - 1, 1, 
  {
   split(dat3, dat2[cnt], ","), 
   try(pcr[datetime(dat3[0])] = dat3[1], msg, break)
  }
 ), 
 del(dat), 
 del(dat2), 
 del(dat3), 

 // PCR検査数表示
 setcom(pcr, "日ごとPCR検査数"), 

 aline(pcraline,pcr,7*24*60*60),
 setcom(pcraline,"PCR検査数7日平均"),

 // 重症者数
 // 重症者数をネットから取得
 // net コマンドだと取得できないので web で取得

 //@"C:\Users\name\Downloads\severe_cases_daily.csv", 
 split(tmp, workfld, @"\\"), // ワークフォルダからダウンロード先フォルダを得る
 // web ダウンロード先ファイル
 svfile = tmp[0] & @"\" & tmp[1] & @"\" & tmp[2] & @"\Downloads\severe_cases_daily.csv", 

 del(tmp), 
 delfile(svfile), 

 webr = web(@"https://covid19.mhlw.go.jp/public/opendata/severe_cases_daily.csv", 0, 0), 
 // ファイルダウンロード待ち
 while(!existfile(svfile), delay(100)), 
 delay(100), 
 delres(webr), 

 dat = fload(svfile), 
 delfile(svfile), 

 // 日付と重症者数の配列を作る
 split(dat2, dat, @"\n"), 
 for(cnt, 1, len(dat2) - 1, 1, 
  {
   split(dat3, dat2[cnt], ","), 
   try(severe[datetime(dat3[0])] = dat3[1], msg, break)
  }
 ), 
 setcom(severe, "重症者数"), 

 del(dat), 
 del(dat2), 
 del(dat3), 

 // 重症者正規化
 smax = fmax(severe), 
 ford(tag, severe, 
  {
   severea[tag] = severe[tag] / smax
  }
 ), 
 setcom(severea, "正規化重症者数"), 

 // 死者数正規化
 smax = fmax(deathsaline), 
 ford(tag, deathsaline, 
  {
   deathsalinea[tag] = deathsaline[tag] / smax
  }
 ), 

 setcom(deathsalinea,"正規化日ごと累積の死亡者7日平均"),

 // 陽性率
 ford(tag, pcraline, 
  {
   if(isdef(adpatientsaline[tag]), 
    pcradratealine[tag] = adpatientsaline[tag] / pcraline[tag]
   )
  }
 ), 

 setcom(pcradratealine, "陽性率"), 

 rgr = grph(pcradratealine), 
 addgrph(rgr, severea), 
 addgrph(rgr, deathsalinea), 

 waitres(rgr)
}

上記になります。
計算式エリアにコピペして計算ボタンを押すとグラフが出ます。

グラフは以下となりました。

covgr.jpg
死者数と重症者数は正規化しています。

青色の陽性率はPCR検査してから結果がでるまで日にちがかかることがあり正確ではないです。
7日移動平均を取りそれをもとに計算しています。

第5波(2021年9月あたり)の後死者数が減っているのはワクチンの影響かもしれません。
第5波の後はしばらくはワクチンで感染が抑えられていたように見えます。

しかし、その後第6波でコロナが変異してしまいワクチンの効果が薄れたのではないでしょうか。
恐るべきコロナウイルスの適応能力という感じがします。
人類はワクチンでコロナを抑えることは可能なのでしょうか。

データからは第6波(2022年2月あたり)は酷い状況でした。

6波で死者数が急に上昇しています。
割合で出しているのでわかりにくいですが表示するグラフを重症者数と、死者数に変えると第5波より重症者数は減っていますが死者数が増えています。
もし死んだ後コロナが見つかった人がこれだけ増えているとすると医療崩壊が起こり重症者としてカウントされる前に死亡した可能性があります。
それにしてもオミクロン株は重症者になりにくいと言われていたにも関わらず死者数は増えすぎのように思います。
第5波に比べ死者数は4倍近くになっているように見えます。
医療崩壊により死ななくてもいい人が死んでしまい実質的にコロナの致死率が上がっている可能性も否定できません。
陽性率が50%にも達してしまっており、ほとんど検査した人は陽性だったことになります。
この値が信頼できる蔓延度とすると第6波でコロナは感染力が倍になっているように見えます。
データからは感染力も倍化し実質的に死傷者は激増してかなり強毒化しているように見えます。
社会的な被害も相当酷くなっているのではないでしょうか。
つまりはコロナは全く防げていなかったということになります。

感染力は増して行っているように見えますので新たなワクチンで抑えない限りまた同じようになるのではないでしょうか。
ただ、ワクチンで抑えた結果が今回だとすると今後の研究が待たれる結果だと思います。

今陽性率が再び5割に近くなり第7波が始まろうとしているように見えますが実際波が来るのかはわかりません。
第6波の感染者が多かった分人間側の全体としての免疫力にも何らかの変化があった可能性も期待できます。
言えることは今はっきりPCR検査した半分の人が感染しており誰でも掛かる可能性があるということだと思いますし、第6波で死者が激増したという事実だと思います。
死者が激増したなら医学的にどうかはわかりませんが人間社会から見て強毒化したということだと思います。
オミクロンの毒性はデータからは下がっておらずむしろ強毒化しています。

第6波での感染はなぜかあまり騒がれず、毒性が弱いばかり強調されていました。
結果、最悪の死者数となっていました。
選挙は自民党が圧勝しました。
老人は0.4%年金を減らされコロナにかかっても見捨てられていたにも関わらずなぜか自民党に投票したということだと思います。
信任を得た形なのでこの傾向は今後も続くと思われます。
第6波の傾向を見ると現政府が老人や病弱な人等のために経済や財政を犠牲にするとはあまり考えられず、会社経営者もこれ以上は持ちこたえられないと思います。
コロナは軽症等色々なノイズに惑わされず死亡率、重症化率の高い老人や病弱な方は感染対策を個人レベルで徹底すべき段階のように思います。
見てもらえる病院もない状態です。
夏休みであまり帰省した家族と食事したりは避けたほうが無難だと思われます。
第7波でコロナが医療崩壊なども起こさず本当の意味で弱毒化していればいいですが。

コメント(0) 
共通テーマ:日記・雑感

資産管理電卓(LineCalc)V1.2.57.0公開 [資産管理電卓(LineCalc)]

資産管理電卓(LineCalc)V1.2.57.0を公開しました。

https://linecalc.blog.ss-blog.jp/LineCalcDownload

・インストール後起動しない不具合の修正
・ライブラリ更新
・Webview2 インストーラ削除
・winput 対応
・thisを使用したコンテキストリソース内関数の無名関数の対応
・fattr 対応
・fcpy 対応
・右クリックメニュー検索非表示不具合対応
・setcom でグローバル変数設定が使えない不具合対応
・strlen,substr で全角文字を2文字として扱う対応
・ワークフォルダ設定初期化対応。
・ワークフォルダ設定時に自動セーブ対応。

インストール後例外が発生して起動しない不具合を修正しました。
ログファイルが事前にあれば起動しますのでアップデートを続けていた場合は起動します。
前バージョンではエクスプローラから ドキュメント->linecalc 下に log.txt というファイルを空で作成すれば起動します。

各種ライブラリを更新しました。
web 内部関数で Edge を使う場合必要な Webview2 が標準インストールされているようなのでインストーラから外しました。
インストールされていない場合はマイクロソフトのサイトからインストールしてください。

キー入力があるまで待機する winput を作成しました。

 fnc(inputw2,
  {
   rkey = "", /* キー入力値(rinput に与える文字列) */
   winput, // キー入力待ち
   /* キー入力 */
   for(cnt2,1 , 100 , 1 ,
    {
     if(!(isdef( ("@" & cnt2) )) , break),
     kystr = argval(cnt2) ,
     if(rinput(kystr) , { rkey = kystr ,break} ) /* キー入力があった */
    }
   ), 
   while(rkey != "" && rinput(rkey) == 1, 1), // キーが離されるのを待つ
   rkey /* 入力されたキーを返す */
  }
 )


上記のような関数を登録しておけば
print(inputw2(^sps,^left,^right))

上記のように特定のキーを入力を待って押されて離されたら処理を進めることができます。
winput はキー入力を待つだけでキー判定は直後で rinput を実行して行います。

コンテキストで定義した関数内で this を使用していた場合、その関数の無名関数を取得して変数に代入するなどして再定義すると this が使えなくなっていました。
{
 bindres(cnt,context),
 cnt.yaa = 123,
 fnc(cnt.foo, this.yaa), // コンテキスト内関数で this 使用
 f = #cnt.foo,  // f は cnt.foo の無名関数により定義
 f //  this.yaa (cnt.yaa) にアクセス 123が帰る
}

上記ではコンテキスト内関数で this を使用しておりその無名関数を f に再定義して呼び出しています。this.yaa にアクセスでき 123 が帰ります。this は無名関数を取得した時点でのコンテキストになります。

ファイルの属性を得る fattr を作成しました。
帰り値を入れる配列名を指定すると配列の中に属性を返します。

ファイルコピーを行う fcpy を作成しました。
ローカルファイルのコピーが行なえます。

右クリックメニューで"定義を別ウインドウで編集"を選択したときにすでに開いていて最小化されていた場合、表示されない不具合を修正しました。

setcom でグローバル変数を設定できない不具合を修正しました。

strlen,substr 関数で引数により全角文字を2文字として扱えるようになりました。

メニューのワークフォルダ設定をすると設定後のワークフォルダの設定ファイルで初期化するように対応しました。
環境の切り替えを行うことが可能になりました。
ワークフォルダを切り替えると移動前に自動セーブされます。

資産管理電卓 v1.2.57.0 の説明は以上です。

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

資産管理電卓(LineCalc)V1.2.40.0公開 [資産管理電卓(LineCalc)]

資産管理電卓(LineCalc)V1.2.40.0を公開しました。

https://linecalc.blog.ss-blog.jp/LineCalcDownload

・グラフラベル非表示対応
・マウスホイールで履歴移動対応
・スタックオーバーフローで落ちる不具合対応

グラフダイアログで詳細チェックボックスをつけるとグラフのポイントごとにマウスオーバーで詳細を表示する点を表示し、チェックを外すとグラフの点を表示しないようにしました。デフォルトは表示するです。

計算式エリアにフォーカスがある状態で

CTRL+マウスホイール上下 : 履歴移動
ALT+マウスホイール上下 : カーソル前まで一致する履歴移動

ができるように対応しました。
CTRL+キーボード上下,ALT+キーボード上下と同じ動作です。

関数呼び出しのネストが深いと突然落ちる不具合を修正しました。
関数を入れ子呼び出しできる限界は1000までです。

資産管理電卓 v1.2.40.0 の説明は以上です。

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

def 関数でのクロージャ [資産管理電卓(LineCalc)]

def や fnc 関数で定義した関数では外部の変数にアクセスすることができません。

{
 tmp = 123,
 fnc(tes,tmp), // tmp は未定義エラー
 tes
}

外部の環境を関数定義内に取り込むことをクロージャと言います。
LCSではクロージャは無名関数では使用可能です。

{
 tmp = 123,
 =>{tmp}()
}

場合により関数内で外部変数をアクセスできたほうが記述が簡潔になることがあります。
LCSのような電卓では数行の簡易なプログラムにより計算を行うことが多いので簡易な記載はなおさら有効です。
そのような場合には、

{
 tmp = 123,
 def(tes,=>{tmp}),
 tes
}

上記のように def に渡す関数の文字列を無名関数により作成するとクロージャを実現でき、関数 tes 内で外部変数 tmp にアクセスできます。

もしくは、
{
 tmp = 123,
 tes = =>{tmp},
 tes
}

=(代入)を使って無名関数を変数に代入して関数を定義しても可能です。

{
 tmp = 123, 
 def(tes,
  =>{
   foo = 456, 
   def(tes2,
    =>{
     tmp+foo
    }
   ), 
   tes2
  }
 ), 
 tes
}

上記のように入れ子になっていても外側の変数(tmp,foo)にはすべてアクセスすることができます。

{
 def(tes, =>{if(@1 > 1 ,  @1 * tes(@1 - 1), 1)}), 
 tes(3)
}

上記のように再帰関数をコンテキストリソースを介さず作成可能です。

LCSでは変数定義が代入によりされ、明示されるわけではありません。
関数内で外部変数にアクスセスできるとテンポラリ変数などがかぶることが多くなり変数の使用が制限され変数使用時の負担が増加しバグの原因になる可能性があります。
その為 fnc や def ではクロージャの環境が無い状態をデフォルトにしています。

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

資産管理電卓(LineCalc)V1.2.36.0公開 [資産管理電卓(LineCalc)]

資産管理電卓(LineCalc)V1.2.36.0を公開しました。

https://linecalc.blog.ss-blog.jp/LineCalcDownload

・sort内で無名関数を指定した場合の this 設定を削除
・ワークフォルダ変更対応
・dbg文字数制限,変数内容表示追加
・execscript 対応
・posinfo 対応

sort 内で無名関数を渡した場合 this が定義されていたので定義しないようにしました。

メニュー -> 設定 -> ワークフォルダ設定 から web リソースのテンポラリファイルなどを作成するワークフォルダを指定できるようにしました。
ワークフォルダを変更するとグローバル変数は終了時に新ワークフォルダに保存され残りますがその他の自分で作成したデータと web リソースのテンポラリフォルダは移動されません。
web リソースのテンポラリフォルダはワークフォルダ移動前に削除しておかないと残り続けますので注意必要です。

dbg で長い文字列の変数の内容をそのまま表示していたのを文字数制限しました。
変数名の行をダブルクリックすると変数の全体が表示されます。

Edge 版 web リソースに対して JavaScript を実行する execscript 内部関数を作成しました。
IE 版の web リソースでは何も起こりません。
メニュー -> 設定 -> IE使用 のチェックを外しておく必要があります。

{
 bindres(we, web), 
 sethtml(we, "<html><body><div id='foo'></div></body></html>"), 

 fnc(addtxt, 
  {
   execscript(@1, 
@"
elm = document.getElementById('foo');
var new_element = document.createElement('p');
new_element.textContent = '" & @2 & "';
elm.appendChild(new_element);
")
  }
 ), 

 for(cnt, 1, 100, 1, 
  {
   addtxt(we, cnt), 
  }
 )
}


上記サンプルでは、web リソースを作成して javascript の DOM を使用して

タグを追加しています。
sethtml に比べ DOM の操作なので html 全体を設定する必要がなく、ログ表示に使う場合などでは動作が軽く(execscript 自体の動作は重いです)、prc などで並列に実行する場合のコンソールなどに使用できます。

情報エリアを任意位置にスクロールする posinfo を作成しました。
文字単位で0から始まりどの行までスクロールするかを指定してスクロールできます。

資産管理電卓 v1.2.36.0 の説明は以上です。


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

資産管理電卓でゲーム(神経衰弱) [資産管理電卓(LineCalc)]

久々にゲームをプログラムしました。

今回は神経衰弱ゲームです。

このゲームは 資産管理電卓v2.0.25.0 以降でないと動作しません。

1人用です。
カードを2枚めくって同じ数字なら回収して無くなるまで続けます。
めくれる回数が決まっていて、ゲームが進むとカード数が多くなっていきます。

*インストール方法

newCDisp.dat をダウンロードして

メニューの

設定 -> 設定読み込み

から読み込んでください。
(※)絶対に 設定読み込み(初期化) を選ばないようにしてください。
元々の設定がクリアされてしまいます。

newCDisp グローバル関数がインストールされます。
すでに newCDisp をインストールしている場合は必要ありません。

後は、以下からソースをコピーして資産管理電卓に貼り付けて計算をすれば実行できます。

神経衰弱

関数定義で定義しておけばいつでもゲームが出来ます。

*ゲーム画面

神経衰弱 LV:1 選択回数:1/5 SCORE:0                                                      
                                                                                
+-+-+                                                                           
|#|#|                                                                           
+-+-+                                                                           
 ^                                                                              
+-+-+                                                                           
|#|#|                                                                           
+-+-+                                                                           
                                                                                
                                                                                
キー操作 移動:← → 決定:スペース                                                             


"^"が選択カーソルで、キーボードの左右で移動、スペースで札を選びます。
選択回数は 今の回数/最大回数 です。
レベルが上がると札の数が増えて覚えておく数字が増えていきます。
手数が少ないほど高得点で、LV 9 で全クリアとなります。

気軽にできるようにカード数は少なめですが高得点は結構集中しないと難しいと思います。

ちなみに今までの最高得点は8242点です。

神経衰弱 LV:9 選択回数:14/29 SCORE:8242                                                 
                                                                                
                                                                                
     GREAT! ALL CLEAR                                                           
     GAME OVER                                                                  
       ^                                                                        
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
キー操作 移動:← → 決定:スペース     


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

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