星田オステオパシー

プログラミング学習日記 2023/01/23〜

2023/02/08 Applyと+
 予定通りドキュメントでApplyを見てみる。Procには引数も含まれているはずなので、0以上使える「v」が気になるかなぁ・・

 +の時もこのSortでもproc lstだしなぁ

 もっと例が無いかな?とWEBをウロウロ。ん?このaddの定義・・組み込みの+ってどういう定義なんだ?と気になる(本来の目的とズレてるが)

 面白半分でChatGPTで質問してみる。
 結果・・いや、この方法は反則だろ


 Apply使わずに・・と頼むと。とことん楽をしようとして来るなぁ


 高階関数禁止で! おっ!?

(define (+ . args)
  (define (iter result args)
    (if (null? args)
        result
        (iter (+ result (car args)) (cdr args))))
  (if (null? args)
      0
      (iter 0 args)))


 ↑これだーっ!いや、ChatGPTやりますねぇ!


 解説は「すでに知ってる人」なら意味がわかる感じかなぁ・・
 今回の使い方はかなり有益だと思いました。ちょっと明日はChatGPTで例文なんかも生成できるかやってみるか・・



2023/02/07 
その1 Racketドキュメントの読み方を読む
 Cametanさんに教えてもらってRacketのNotationを読む。ここに読み方が書かれてたのか〜。DeepLに手伝ってもらう

 正規表現っぽい書き方なんすね。あと、|ですけどORの意味なんですね。なんか謎のツリー構造だと思って敬遠してました

 なるほどなるほどand/c any/cの/cって何だよと思ってましたけど、メタ的にand anyと読み変えていい感じかな

 引数有りなしの場合には上下に並べて書かれてるわけか

 とりあえずNotationは読み終わったのでReferenceで気になる項目を実際に読んで見るか・・・

 Structが最初に見つかったので(確かに実際にプログラム書く時って構造を考えますし、そういう関係で最初に説明されてるのかも?)・・
 継承でのスロット名って親構造体の名前を使うのか・・把握しておくの大変じゃないかなぁ

 オプションの面白そうなのを見ていく。この#:sealedは使えそう(いつか他人と共同作業することがあれば)

 エラー表示の際に望むシンボル?文字列?で期待されてる型を示唆するオプション。なんの意味があるのか?エラーの補足に使えたりするんだろうか

 デフォルト値を設定しておく#:autoは便利そう

 おおっ!?構造体の中にProcedureを埋め込めるのか!これは面白そうじゃないかな



 StructとDefine-structの違い。あ〜なるほど、ナウシカ作りはじめの頃にこれで混乱してたな。なんで残ってるのかは知らないけど自分の中ではStructに統一しておこう。

 という感じでしばらく読み進めていこうかな、と思いました

その2 Apply
 同じくCametanさんからのアドバイスでApply。見抜かれている!Applyについて全く理解が及んでないことに!いや、そーなんですよ!なんか使いどころが分かってないんですよね〜。「()を外す」ってのはハッとする説明でした。
 明日はApplyをドキュメントで読んで、色々と試してみたいと思います。ありがとうございます(^o^)





2023/02/06 なんかRacketドキュメントを読んでいく

 Hashの一件でドキュメント読解力の必要を感じたので、そのままドキュメントを読んでみた。パラパラ見てるとHash-mapという関数が。名前からして便利そうな気がするので動かしてみるか・・と思ったが例文が無い。けど似た名前のHash-map/copyは例文があったので参考にして挙動を確認する。ふんふん、キーもバリューも同時にいじって多値として返せるわけか


 ところが同じように書いてもHash-mapの方は動かない。うーん・・と、ようやくここで謎の暗号みたいな書き方の書式みたいなのを比較して読み解く努力を始める。あ、返り値が多値じゃなくて、リストで返るということか・・。いや、ハッシュでバラバラになってるので値だけ返されても・・使いみちあんのかね、コレ


 あ、キーを使うことも出来るのか。じゃあまぁキーと値を出力するのとかに使えるか・・(Hash形式、中身が見れないし)。
 とまあ、こういう感じでイジっていて段々と面白くなってきた。こうなったら最初から見ていって、気になる関数とかは兎に角動くまでイジって自分で例文を書こうかなぁ・・という気分になってきた


 ドキュメントの最初を改めて見てみると、WEBアプリまで作る事が出来るのか・・と驚く。全部だとキリがないので、とりあえずRacket/baseの部分だけでも例文を書きながら読解してみるかなぁ・・検索して出てこないってことはやる値打ちがあるんだろうし

 手始めにRacketの作法みたいなところから読み始めてみる。
 そうしたところ、最初のコメントアウト関連で早くもちょっと感動する。#;ってメチャクチャ便利やん!関数のコメントアウト#||#でやっててすごく大変だったんで!

 関数内の束縛もLetだとインデントが深くなるので出来ればDefineで・・とか、そーゆー風に考えるのか〜とか

 という訳で、今後の予定は二転三転してるけど・・平日はドキュメント読解と動く例文作成、宿直でDD&Dって事でRacket漬けで行こうと思ったりなんかして?

 ※本日のCametanさんの記事を読む前の状態です



2023/02/05 ハッシュ、Cametanさんに教えていただく
 例によって・・ありがとうございます!

 なるほど、そもそもmake-hashって連想リストからハッシュを作る関数だったのか・・そんな事ドキュメントにあったっけ?


 あ、もしかしてAssocsってのが連想リストの事なのか?確かにAssocは連想リストに関係しそうだけども・・・一度ドキュメントの読み方をキッチり勉強するべきだなぁ(今更(^_^;)

 ところで全然突然なんだけど、ふと思い立って最近話題のAIチャット、ChatGPTで解決できるかどうか実験してみました。噂通り「シレっと嘘をつく」ってのは真実!

 ついでにAD&Dのキャラメイキングについて聞いてみた。ふんふん・・ザックリしてて使い物にならないので・・


「もっと詳しく」と求めたが全然。詳しくない


 じゃあ試しに一人作ってくれとリクエスト。冒頭の「はい」にどっしりとした自信を感じたのだが・・ふざけんナw。
 AIつってもまだまだだな!
 やりとり自体は人間っぽいんだけど、手の抜き方が超人的だな



2023/02/04 ハッシュ表を使ってアイテムを表示したいので調査
 ラピュタゲームブックで手持ちアイテム一覧を表示する機能があるんだけど、そこでアイテムに画像をつけたら雰囲気が出るかなと思ったわけです。
 で、折角なのでまだ使ったことが無い概念「ハッシュ表」を(無理やり)使ってみようかなと。
 ※画像を表示したいだけならアイテムを連想リストじゃなくて構造体で作ってればイイだけの話なんだけど今から書き直すのは手間過ぎるし!

 例によってRaketのドキュメンは意味不明だったのでCametanさんのブログを参考にさせてもらいましたm(_ _)m

 ちなみにこういう記述を発見。構造体にしなくてもAssocで参照してN番目(画像が入ってるトコロ)を呼べばいいのか・・ま、今回は置いといて!


 ほうほう・・。
 ハッシュって言ってもドットリスト形式で管理されてるのか・・。

 で、いざhash-setして行こうと思ったんだけど面倒だな〜Map使えたらなぁ〜・・という気分になったので実験としてアイテム数を絞ってEquipリストと

 順番を合わせたアイテム画像のリストを用意して

 ハッシュテーブルを定義してMapでドン!

 行けた!ちょっと感動した。あれ?ドットリストじゃないけど・・

 じゃあRefって見よう!と思ったがキーが見つからないという。んなアホな!

 もしかしてMapでやったから()多すぎ問題の時と一緒で入れ子になってRef出来ないのか?と思って単品で実験。が、同じ・・

 hash-ref-keyじゃないと駄目なのか?と思ったが関係なし

 得意の総当り方式で実験、make-hashして破壊的変更のset!であればうまく動くと判明。うーん、でも破壊的だしなぁ・・

 うまく行った方式でMapを実行。ちゃんとhash-refで参照できている。
 む?返り値が最初の(hash)の時と違ってる。うーん・・という事は・・(hash)で作られていたのは連想リストだったのか!?ドットリストだったし?

 謎は残るがとりあえずこれでアイテム一覧表示関数を改造してみますか


2023/02/02 Mapで()が多すぎ問題の謎が解けた
 前回、なんとなく動いてたけどCarを使わないと()が多すぎてたアイテムゲット関数。引数を複数取れるのを目指してたけど実際にやってみると

 おゴーッ!ちょっと考えたけど、Argの要素ごとにEquipにAlist-consしてるんだもの、なるほど・・こうなるわな・・。

 こういう結果が欲しい。再帰だったら出来るのにMapで出来ないハズが?と色々とやったけど思いつかない。そんなハズは・・と、一旦寝て宿直からの帰りの自転車で気づく。
 ハッ!Consと言えば・・Fold!

 来たー!なるほどそういう事か〜・・しかしコレではっきりしたな。やっぱり高階関数の理解が曖昧だったということがw


2023/01/30 Match系
 宿直明け、なんかまだやる気がみなぎってたので帰宅後にそのままプログラミング再開。

 必要な関数をダラダラと作ってたんだけど、戦闘時の選択肢表示の部分でまた自力では書けないことが判明する。match-letをmapして・・という例のアレ。
 ということでちょっと基本からやってみる
 ふんふん・・一番シンプルな形から。なるほどMapだとdisplayが余計だった。for-eachだったら数字だけになりそうかな

 ふんふん、特定の型にマッチしたものを読み込んで束縛して、同じ()の中で変数を使った式を作れるわけだな

 Enumerateを使って、コレがほしい形だな。ところでMatch-lambdaとMatch-letって具体的にはどう違うんだろう・・?と気になって


 Match-letを使って同じ出力をするのにはどうするかを考える。通常のリストから開始して・・

 単発で出力できるようにして・・

 これで同じ出力、こうなるワケか〜。なるほどMatch-letの場合はリストが自動で取り込まれて、Match-letの場合は自分でLambdaを使って取り込んでやらないといけないだけで同じことやってるな?
 うーん、自分ではコレでかなりスッキリした!



2023/01/26 返ってきたBig-bang

 先日気になったBig-bangからの返り値問題。ドキュメントを見てみると・・
 最後のReturns this last worldってのが気になるなぁ・・返ってくるんでないかい? 


 Stopの名を冠するHandler(?)にはもう一つある。うーん、こっちはなんで構造体なんだ? 説明を読むと・・Big-bang実行中に特定のw状態になったら強制的に終了できるような条件を設定できるということかな?知らんけど


 気になったのがこの図で、明らかに複数のWorldを行き来できるように見えますよね?
 早速検証!と思ったのですが・・その検証用のWorldを用意するのが面倒なんだな〜・・ということでGithubにあったRoRのコードで一番シンプルなのをお借りしてくる。

 数当てゲームの実行結果。むっ!?リスナーにinterval構造体の最終結果が返ってるじゃないか!今までちゃんとBig-bangで遊んでなかったので気づかなかった〜

 ふんふん、ここのが返ってきてる訳だな

 という訳で関数型言語っぽく処理したところ・・出来るじゃな〜い!
 うおお・・これでCLIとGUIを自由に行き来できる多数の世界(World)を持つプログラムが作れることが確定した!まさにUniverseの誕生だ〜(^o^)
 はっ!?もしかしてライブラリ名がUniverseってそういう意味でつけられていたのか?
 ラピュタはもうオールCLIで行くって決めてしまったので、この仕組みはなんちゃってAD&Dで活用していこう。あ、なんちゃってAD&Dって言ってたけどややこしいし烏滸がましいので
 名付けて「Disadvanced D&D」、DD&Dって名称で行くからよろPく!


2023/01/24
その1 Big-bangって終了時に値を返すことが出来るのか?

 AD&Dの戦闘部分だけならRacketのUniverseでGUI化出来そうだな?とか考えていたのですが、ここで閃く。あれ?Big-bangって終了時に値を返したり関数を呼び出すことが出来るのか?

 もし可能ならばCLIでADV部分、戦闘に入ったらGUIを呼び出し終了したらCLIに戻るとか、そもそも複数のGUIを連鎖させることが出来たらキーマップ問題なんて簡単に解決できるではないか!と。時間作ってドキュメント読んでみよう。

その2 その他Racket化出来そうなもの
 GURPSシステムを使って・・とか考えてたんですけど、古雑誌の付録データを漁っていて、まんまズバリでGURPSを用いたゲームブックなんてものがありました


 という事は間違いなく可能ですよね。スキルに関してはゲームごとに特定の物に絞り込めればシナリオに簡単に入れられるし・・ありだな!実はシナリオ集なんかも結構持ってるんですよ


 そしてこちら、山本弘さんがデザインしたトランプを使ったゲーム「四人のキング」。プレイしたこと無いんですけど、確かトランプのスートと数字をマップに見立ててシャッフルして配置することでローグライクなゲームになってたような?

 システムはマジでナウシカとかラピュタと似たようなものなので、こちらはマップの処理の勉強が出来そうナリ。
 という感じでやりたい事は広がるんですけどねぇ〜(^_^;)


2023/01/23 AD&Dの再現を考えてみる
 PoRのプレイを進めたのでルールに従ってRacketでどうやって再現するかの続きをちょっと考えてみる。まず、キャラクターの要素が少なすぎたのでステータス画面を見ながら足していく。多いなぁ・・・


 ステータスの中の「THAC0」と言う命中判定用らしき項目があるのだが・・うーん、AC0の相手に対して命中する時の目安・・・?なんだそりゃ?と思ってネットで見たら不評だったのかすでに公式で撤廃されてる模様。
 さて・・どうしたものか・・折角だから判定とかは洗練されてる新しい版に沿ったものにするのも良いし?

 いや、別にAD&Dに拘らなくてももっとシンプルなルールを取り入れても良いんだよなぁ・・シンプルと言えばGURPS?

 TRPGをプレイしたことは一度も無いくせにルールブックは10冊位持っていた僕は当然抑えているのでありました。

 確か判定は6面サイコロだけで出来たような?
 あ、でも・・今後レベルアップの処理とかを考えるとやっぱりAD&Dに沿ったほうが良いか・・AD&Dのルールブックは持ってないのでネットで調べることになりそうかな。

 で、ここで懐かしいゲーム関係のスキャンデータを見てしまったのが運のツキ・・ついつい懐かしくて色々と漁ってしまって夜が更けてしまったのであった。
 でも、ゲームブック用の汎用戦闘システムとしてGURPSでルールを書き換えるのはありかも知れないな?
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事