2023/02/21 DD&D、別の構造体を混ぜてSortの問題

さて、別種の構造体をリストに入れてそれをSortする問題。実は頭の中では「Caseと(variant x)を使えば楽勝だろう」と考えていた。
が! Sortの文法だとxが無いw

同種の構造体であればこのようにオプションを使って

Sort出来るのだが(後ろから三番目がDexです)・・

こういう風に書きたいのに!

相手が構造体だけど、もしかしてCar Cadr...の形で参照できるなら、両方共ケツから3つ目ってのは共通してるので大丈夫かも?と思ったが駄目か・・。
Foldを使って?・・いや、構造体を判別してSortするオリジナル関数を作って・・とか考えたんですけどハッ!と気づいた。ちょっと前に構造体の継承で
「なんで継承元の構造体名を使っての参照なんだよ、ややこしいなぁ・・」
なんて事を言ってましたよね、僕!

こんな感じでHEROとENEMYそれぞれをCHARCTERから継承した構造体として再設定し(いくつか面倒な書き直しをした)

継承元のCHARACTER-DexをkeyにしてSortすれば!

デデーン!無事にDex順にSortが出来た!
・・・継承・・最高やんm(_ _)m
2023/02/20
話題その1 ちょっとだけHow to design...を読む

はぁ〜面白い! どうやらGUIシステムを使ったプログラミングをやっていくみたいなので楽しみナリ
話題その2 DD&Dの実験など

GUI戦闘の実験のためにENEMY構造体を作る。獲得Exp、ドロップItem、特殊能力用のスロットを用意しておくか・・・

テスト用BATTLE構造体に放り込みまして・・・

まずは表示が出来ないと駄目なので表示部分を改造。とりあえずCHARACTERとENEMYは別スロットで管理する前提で・・そしてここで前から気になってた問題。構造体で場合分けするってどうすんのか・・

エラーメッセージを参考にして#<CHARACTER>で試すが・・そもそも許されてない模様

もしかして・・Cametanさんに教わった型判定用のdescribeで出来たりしたら笑えるなぁ・・と思って試したトコロ

なんと大成功!うおお!これが出来るなら相当応用が利くで!!

と、ここらで今後の事を想像してみたんですけど・・ヒーロー、エネミーをそれぞれ別スロットで管理するのはちょっと・・スパロボとかFEみたいな完全ターン制SRPG式バトルだったらオッケイだけど、AD&Dの亜種を目指してるとなるとやっぱり・・DEX順(厳密にそうかどうかは実は知らんのだけど)にするしかないか・・と。となると、構造体のスロットを変更せざるを得ない。
キャラのリスト管理は疑似Cycle-list的になるのでキャラ変更ごとにPHASEに加算して敵味方のキャラ総数と同じになったらTURNを増やして・・とするしかないか・・と、言うわけでココでGitでBranchして全体的に変更する方向へ
明日は別の構造体を混ぜて構造体ごとの任意のスロットをキーにしてSORTする方法を実験して見つけよう、ということで終了ナリ
2023/02/18
話題その1 Cametanさんの記事

ゲッ!まんまと混同してました・・

あ、なるほど!すごくシックリ来ました。結局C言語も高級言語なのでガワの中身に直接コンタクトしてるわけでは無いって事ですかねぇ

で、コレなんですが・・

ガツン!と来ましたねぇ!あ、そういう事か〜(←間違いなくまだ分かってないw)と。なんとなく段々と理解の解像度が上がってきてる気がする・・これは無理やりにでも使ってみなければ!ありがとうございます(^o^)

SchemeからC言語か・・・まあ30行くらいじゃないかな?と予想してリンクをたどると

えーっ!?これは予想外w 人間みたいに適当な融通をつけてないからなんですかね?(噂のポインタ関係とか?)

こういう話を聞くと脳の可能性はまだまだ未知数だ・・とワクワクしますねぇ!訓練でなんとかなるものならメソッドが知りたいですよねぇ・・腐るほど居たということは再現性があるわけだし。今からアセンブリはいらんかなぁ・・と思いますけど
話題その2 RacketのBig-bang関連
昨夜、ようやくBig-bangの動きが少し分かってきた訳ですが・・・
もしかしてBig-bangでの「演算」部分って全部on-keyに詰め込まないといけないわけか・・移動先が敵の座標だった場合に戦闘判定が発生するとしたら、ヒーロー構造体とモンスター構造体のリストのスロットにそれぞれ関数を書いて構造体を生成しなおして値を返す・・と。だが、スロットが別だった場合乱数を使った判定では別スロットではそれぞれ結果が違ってしまうような?まあ、実験してみないと分からんけど。
そしてどちらにしても、CHARACTERとかENEMY(まだ作ってないけど)構造体の内部に座標データを持たせるか、リストをドットリストにして((CHARACTER構造体 . (posn x y)) ...)って形にしないとヤバそうだな・・(攻撃を受ける方の座標を連動させるため)。
一番良いのはon-keyでスロットごとに値を返して処理・・じゃなくて、(今回は駄目だった方法だけど)再生成した構造体をまるごと返して処理する関数が使えることだと思うんだけど・・
それが無理だとするとCHARACTERとENEMYを最初から同じスロットに座標も持たせて配置するしかないような気がしてきた。イニシアティブはどうするか決めてないけど、単純にDEXでSortして・・CHARACTER構造体の場合はOn-key、ENEMYの場合はAIチックな操作で場合分け出来るか・・。あ、状態異常スロットも作らないとイカンか(操作を飛ばすため)・・
とりあえず、Big-bangのClauseをちゃんと読んでみよう
2023/02/16 GUIで勇者グループの表示

昨夜宿直でドラフトを作った関数の挙動を試すべく帰宅後すぐに実験開始。次の日曜日までなんて待てねぇ〜
BATTLE構造体(いわゆる環境変数)に仮のデータとして複数のCHARACTERと座標リストを用意。これを

こいつに流し込む、するとぉーッ!

・・・まあね、だろうなとは思ってましたよ(-_-;)

最終的に欲しいのはいわゆるシーケンス(←早速使ってみた)なので、ここはFoldだろう。

うーん・・違うなぁ

うーん、方向性は間違ってないと思うんだけどなぁ・・あ、Foldrだな、やっぱり。

これも駄目か・・入れ子にしたシーケンスをplace-imageに渡せば処理できそうな気がするんだけど・・

形としてはコレだと思うんだけど・・動かない・・うーん・・・。
あり?もしかして、根本的に間違ってるのでは?シーケンスで出力してPlace-imageに渡すんじゃなくて、Place-imageでの結果を入れ子として出力しないといけないのでは?
結果・・・

出来た〜っ!なるほど、今までFoldではConsしか使ってこなかったから発想が浮かばなかった(苦しい言い訳)。
これって入れ子の形になってるシーケンスタイプなら色々と応用効くんじゃな〜い?
ま、とにかくコレが出来ればプレイヤーもモンスターもいっくらでも表示出来るっ!多分!
テンション上がるわ〜
じゃあスッキリしたところでPoRの続きやろうっと
2023/02/13〜15
話題その1 Cametanさんからの返信

えっ!そうだったのか・・という事はCLをやれば自然とオブジェクト指向の勉強にもなるわけか・・

継承について。なるほど・・確かにどんどん概念を拡張するような大規模な開発だと役に立つと言われるとそうかも!という気がしてくるような・・どちらにしても一度テッテーしてオブジェクト指向的なのを使って何か作ってみるかなぁ・・


そしてコレ!いや、型の表示なんて簡単に出来て当たり前だろうに何故見つからぬ?とか思ってたんですけど、想像以上に深い話になって驚きました。ありがとうございます〜

しかしコレには驚いたなぁ・・これでエラーが出ないとなると相当しっかりと管理しないと謎の挙動で大変そう
話題その2 続けてドキュメントを読む

関数で済むならマクロは使わないようにってヤツですね

地味にdisplaylnが便利で笑う。何でもあるなぁ

エラー発生時に好きなメッセージをつけられる・・と言っても、Syntax-errorの時にはコレって感じで1:1でつけるなら意味あるとは思えんのだが・・

エラーの補足。なるほどなるほど・・CondとかCaseとか使ってるとスンナリ入って来るような気がしますね

exn:fail?はとにかくエラーなら何でもって事か。この時、たまたまmismatch-errorを起こしたのだけど

mismatchを受け取るHandlerのオプション?って見つからないんだよなぁ・・まあ、使うアテもないですが


あ、そうなんだ(・。・; 覚えておこう

ずっとcall/ccの/って?とは思ってたのですが、なんだwithって事か。
call-with-current-continuitionをただ略しただけかw

確かにそんなに行数ないのに実行するとなかなか始まらなかったりするんで不思議だったけどracketでやってたわ。一度racket/baseで作業してみるか・・

ドキュメントの続きにはこの本へのリンクが。この際DeepLを使ってではあるけど、一通り読んでみようかなぁ・・

ギクリ

確かにね・・今後AIが驚異の発展を遂げて人間がプログラミングする必要がなくなっても少なくとも頭の体操としては最高だと思いますねぇ
2023/02/12
その1 Cametanさんからの返信
Racketのお作法を日記で書かせてもらった事で返信をいただきました〜

おお〜なるほどこれは分かってれば便利ですねぇ!SchemeにあるってとはRacketには無いのか。アナフォリック・・前方参照という意味らしく検索すると

On Lispの内容にヒット。あ、なんかaifって前に聞いたことあるなぁ。ちょっと覚えておいて、また近いうちにちゃんと見ようと思います。On Lispもやりたいなぁ(その前にSyntax-rulesだけど)。

なるほど〜・・一瞬ギョッとするほど違和感があるってのは、今までに出会った例文なんかで全然使われてなかったってことで、そんだけ普通には使う必要が無いという事でもあるんですね。本来Lambdaが引数を1つしか取れないのは意外でした・・
その2 Racketで型を調べたい
DD&Dの関数を作っている途中で要素の型を調べたくなった。Gaucheだとtypeof?だったかな?そういうので調べられたと思うんだけど、Racketには特別なライブラリを入れたりしないと調べることは出来ない?いやまさかそんな・・


ということで例によって実験としてChatGPTで尋ねてみました。type?でもなくtypeofでもなくてtype-ofというあり得そうなものだったので実験した結果・・(少なくとも標準では)type-ofなんて存在しませんでした!
更にobject-infoも駄目。あのさぁ!
しかし、一体どういう経緯でこんな間違いを導き出してくるんだろうか?不思議だ・・
そのうち、GoogleのBIRDとMicrosoftのBINGとの三つ巴でRacketの質問に対する精度のチェックをしてみるかなぁ
2023/02/09 Racketのお作法の続き



Racketのお作法が途中だったので続きを読む。あ、Ifは推奨されてないんですね。確かにBeginは面倒だったもんなぁ・・



ローカル定義はついつい忘れてしまうので意識するようにしないとなぁ

う、なんだこのGoodの定義は・・カリー化について言及されてる部分があって立ち止まる。

気になったので、サルでも分かるというカリー化の記事を見る。そもそもアロー関数が分からないのでそっちも拝見する。まあLamdaですよね

じゃあ書いてみるか・・こっちは全然分かる。

で、カリー化の方は・・うーん?

あ、こういう事か!って、書式そのままじゃねぇか!いや、予想外だったけど勉強になりました

「4.8 Traversals(横断的知識って事?)」For/foldが出てきて、For一族も参照とあったので、見に行く。

なるほど、再帰、高階関数に加えて別の道ってことだな?初期化とリストを与えてBodyを書けばリストの分繰り返すと・・Foldで良くない?

ところがお作法だと思いつく形はBADなのだ。うーん、まあシステムのつくり手が言うんだからそうなんだろうな・・覚えておくか

初期値を設定して、リスト内を足した物と、iの平方根がConsされると。初期値をいくつも取れるので多値を返す機能は都合が良いな

何の気なしにリストじゃなくて数値を入れたらどうなるんだ?とやってみた。えっ!?6?

5だと10?

6だと15・・ようやく法則性が見えてきた。数値を入れると0~(- 数値 1)のリストになるのか

続いてFor。ふんふん・・#when~ってなんだ?消したらどうなる

えっ?予想外の動き。限定が外れたら増えると思ったら減った。この状態だと一番リスト要素が少ないものに合わされる感じだな

どうも普通のオプションと違って#whne~の次の式が優先されてるっぽい?kを増やすと・・とりあえず奇数に関してkだけは全部出すって感じだもんな

jにかけてみる。まあオプションを使う必要が来るかは分からないけど、複数のリストを用意して操作して新しいリストを作りたいときには使えそう

続いてfor/and。おおっ!?これは使えそうじゃないですか?リスト内にとにかく1つでも真があるかを調べるときにはスマートに使えそう

ほう、これは最初に設定されたリスト数に合わせてそれぞれ出力できるのか・・ちょっと使いみちが思いつかんが・・と言うか、この辺りでしんどくなってきたので今日はこの辺で・・(^_^;)
この後むちゃくちゃPoRした