星田オステオパシー

プログラミング「学習」日記 2022/05/10〜

プログラミング日記なんて烏滸がましいのでタイトル変えました(^_^;)

2022/05/30
 Actor理論の2回目を読む。3回読んだら理解が深まるかも知れない。

 例の関数の再定義シリーズを続ける(結構楽しみなんですよね!)  
 Appendって引数2に足して行ってたのか(今更)

 こんな感じかなぁ・・

 
 Memberの再定義。むっ!なんだこのCase-lambdaってのは!マニュアルで確認、はぇ〜便利だ。引数の省略とか簡単に出来ますね!


 同じ形でAssoc再定義。結局Equal?系しか述語が使われてないけど、形を覚えておいて損は無い気がするかな。


 同じパターンで連番リスト作成Iotaの再定義。なるほどこれは美しい(個人の感想です)。

 ところで関数の定義なのに中身がLambdaだと文法がこうなるのか(多分、恐ろしく今更な話)・・これは覚えておこう!

 という訳で次回からとうとう「高階関数」の再定義になるってことで楽しみだ!とりあえずそこまでやったら高校数学に戻ろうかな。


2022/05/27
 ちょっと思うところありました・・Cametanさんからのリアクション


あ、本当だ!

そしてこちら(-_-;) 以前からちょくちょくあるけど、何も調べずにテキトーに書いてしまってCametanさんのお手を煩わせるという・・申し訳ありません!
とりあえず今後はちゃんと調べたり実験した上で、どうしても解決できない事だとか疑問だとかの形になった時点で書くようにします。

 Actor理論の記事、一周目を読みました。ちょっともう一回読もう。

 図書館でリクエストしていた「闘うプログラマー」到着。読み始める。WindowsNT系にはお世話になったので(2000だけど)・・。Win95系の不安定さからびっくりするくらいに安定した2000、中心になったカトラーって人が最初はコンピューターを毛嫌いしていたって話なんかも聞いてて興味をそそられたので。


2022/05/26

Foldの挙動が曖昧だったので調べないとな〜とか思ってたら・・Cametanさんがこれ以上ないってくらいに解説してくださいましたm(_ _)m

 今回は保存版っぽいな!と思いましたのでKindleに飛ばしまして(^o^)
 この2つはまさしく「えっ!」と思ったところでした。


 初期値が「どんな型でも取れる」ってのがすごいですね・・ドットリストを使ってACCの役割させてたのは驚いたなぁ・・つまり初期値と同じ型が返せるLambda式を書けば良いってこと・・になるのか・・な?

 あ、マクロでよく聞く「展開」ってこういうルールで変換されることを言ってるのかな?まずはSyntax-rulesからだけどいずれはマクロも・・けどその前にこの流れでまずは「継続」を・・Cametanさんから教えていただいたActor理論のページ、Kindleに送っておいたのでじっくりと読んでみよう!と。

 という訳で写経。単にリストにする部分の文法が変わってるってくらい?


 `の文法は置いといてリストの中にカウンターとACCが合体してる構造が美しすぎる!! もちろんコレクション行きで


 うん、初期値が決まればLambda部の書き方が決まるという事だろうから、まさしく出力するデータ形式を決めてプロシージャを作るってことなんすね!

 

 初期値部分に演算(って言うのか・・分からないんですけど手順的な?)のような物が入ってても良いと。


 まさしく最初、この直球版的な発想で書こうと思ってRacketに弾かれたんですよね!リスト数を同じにしないといかんとか・・じゃあ無理や・・と。

 あとList-refの時にドットペアでCAR部にカウンタ(y)、CADR部にxnのCARを入れれば!と思ったんですけど初期値が更新されるって分からなかったので ((0 . a)(1 .b)(2 .c)...とリストがつながって行くイメージしか出来なくて「じゃあ結局特定するのにList-refがいるじゃねぇかwと。
 Assvで探してあったらCDRを返すってのを合体させたら・・とか考えたけど、さすがに意義を見いだせなかったので諦めた思い出。

 じゃあ明日は清掃バイト+宿直なんでActor理論の読書メインで




2022/05/25
 いや〜なんか妙に仕事やバイトが詰まってて2日間学習進まず!驚いたことにたった2日なのに間が空くと明らかに「内圧」が下がってるのが自覚できてしまうもんですねぇ・・手を休めたらアカンという事ですか

 まずはこちらのCametanさんのLast-pairをFoldで書いたコードを・・あ、そうかw これは目的とする出力イメージの操作が出来てなかったなぁ・・ありがとうございます!


 そしてLis-refのFold版。うわーっ!そうか!Call/cc! 前に「覚えておこう」とか書いておきながら全然思いつかなかった(^_^;) これこそ使うべき場所だった!と教えていただいた後だと分かるんですが。いや、今回は復習ってのもありますけど前より染み込む気がする。

 折角なので「継続」の解説を読む。

 あ、前回よりも(比較的)すんなりと入ってくる気がする。継続渡しとかも曖昧だったからこれを機会に明日の夜は継続を学習しよう。LambdaとFoldで思いましたけど、苦手なのは集中的にガンガン打ちまくるのが良さそうですね。



2022/05/23
日付も変わった頃、もうちょっとやるか・・と継続
 Dropの再定義。これを参考にして・・


 Letrec版を自作してみる。さて、問題はFold版だが・・

 よっしゃ!そうか・・yの取る数字のリストを操作すれば狙った部分をFold出来る。ん?ということは・・諦めていたLastがFoldで出来るのでは?

 出来たw! ネットがまだ使えないので、深夜1時、図書館の近くの道路に座って打ってます(^o^) これでスッキリ眠れる!


2022/05/22

  そんなに意外な事だったとは・・(^_^;) リストが対象でProcで操作するんだったら出来るんじゃないかな・・僕には出来んけど! という感じでFoldのパワーを単純に信じてたって感じで。しかしそれを短時間で解決する方法を思いつかれるとは・・




 早速変数の動きを追いながら学習を開始する。ん?

 え?

 ちょっとまだFoldの理解が足りてなかったな・・。yのリストが進んでいくのはイメージ出来てたけど。これはちょっとFoldlの定義をまた見直してみないといかんな〜


 ネットの接続が悪すぎて(YUモバイルの容量を使い切ってしまった・・もうMineoが届くので)、調べものが出来ないのでKindleに移してある例の「Scheme Junk Scripts」の学習を進める。今日はリストからの抜き出しの関数。



 上の2つを参考にしてLetrec&Lambda版を自作。だんだん書き方が分かってきたかな〜。これも高階関数版を考えようと思ったけど・・こういう一つだけ抜き出すパターンには使えない印象。FoldLやMapの畳み込みが「何回目か」を判定する関数が必要な気がする・・それがあれば (if (= (リスト要素数) (何回目の適用か)) で条件分け出来るんだけどなぁ・・
 追記:リストのLengthでラストは特定できそうかな?

 続いてlist-refの再定義。これを参考にして・・

 Letrec&Lambda版。ホイホイ。これもFoldを使おうと思ったら
(if (= n(何回目の適用か)) で条件分けが必要そう・・
 追記:こっちはやっぱり畳み込みの回数が分からないと駄目かなぁ。あ、いやもう一つカウンター専用の引数を作れば良いのかな?後でやってみる
 追記:無理でしたw


 takeの再定義。これを参考にして・・


 ムッ!これはなんかfoldが使えそうだということでfold版を・・Cametanさんの次の初期値がXって話とConsでリストを作る例を見せてもらってたので参考にさせていただいて。

 しばらくこういう感じでLambdaと高階関数に慣れて行って、その後またRoRとかに戻ったほうが良さそうかな。例のSchemeプログラマレベルだけど、上達のロードマップってことだろうから抜けてる項目をちゃんと下からやって行くようにしようかな・・



2022/05/21
 例によってCametanさん情報で知ったグラフ描画ライブラリの実験を・・。我が家のWindows7PCはネット接続機能が完全に死亡してるのでどうだろうかと思ったけど無事にRequireが通った。って事は一度インストールしてしまえば全部パッケージになって入ってるのか!これは便利だ・・Rakcet最高だな!
 ちなにみ例の高校数学をPythonで・・って本も、ちょうど二次方程式のグラフ描画のところだったからタイムリーすぎる!ひょっとして目次ご覧になって差し出してもらってるのか?というタイミング(・。・;

 遅延評価の勉強をちょっと。Stream系とLazy系の2つがあるのかな?お気楽さんの方ではLazyというものだったのでいじってみる。ほう・・Forceで実体化させないと変数そのままでは扱えないんですね?


 ちょっと疲れ気味だったので遅延評価はまた今度に回して、お気楽プログラミングさんの「Scheme Junk Scripts」ってページをKindleに送って写経とか。今日は定番のフィボナッチ数列をやってみるか・・と。

 まあ、この辺は別に


 Letrecは完全に忘れてたのでちょっと読み直したり。そう言えば名前付きLetが一番書きやすいとか思うときが来るとは思ってなかったなぁ(Do派でした)。


 で、こっからが本番や!何でも高階関数で書いてみるチャレンジを試みよう、と。こっからどうやっていじって行くか・・が、どうしても思いつかない(^_^;)。
 あ、Procが+ってのは置いといてFoldLを無理やり使ってフィボナッチ数列をひねり出す方法が分からない。前の出力結果が必要になるので再帰だったら分かるけど、Lambdaの定義の中で結果を保存しておいて再利用するってのが、コレほんと3時間くらい考えてたんですけど駄目でした。典型的な時間の無駄だな!
 で、発想を変えようと。0〜nの連続した自然数のリストを与えて「フィボナッチ数」かどうかをチェックする「fibo?」的な述語を作ってFilterで選別するか!と。そうなるとチェックするアルゴリズムが必要だけど・・まずそれを探す作業が始まった。

 なんかフィボナッチ数の一般項ってのが見つかった。一般項って?判定式として使えるのか?とそのままRacketへ

 ゼロ?

 13?

 なるほど!整数を入れたらフィボナッチ数が出力されるのか!無理数が入ってるので誤差が出るけど。
 え?けど待てよ・・これがあるってことは適当なRangeのリストを読ませたらフィボナッチ数列は確かに出るけど・・なんかコレじゃない感じが


 MapとLambdaで。いやまあ、そうなんだけど・・・

 FoldLで・・うーん・・

 いや、こういう形でひねり出したいんですよね・・複数の連続した普通のリストを組み合わせてどーのこーのとかそういうので出せないものか・・・と。例えばLambdaの引数を増やして一時的に結果を保存しておくとか・・はっ!?そうか、もしかしてハッシュリストでメモ化って使えるのか?と、今、これを書いてて思いました。

 とりあえずまあ、期せずして数学スクリプトで遊ぶってのは達成できたかな!




2022/05/20
 高階関数の練習問題、Cametanさんの解答例を拝見する。あ、なるほど・・僕のはいかにも冗長って感じだったけど、Foldlの初期値を含めた部分をLambdaで作るわけか・・僕のはリスト部分をMapとLambdaで作ってたと。コレクション行きで。ただ、Factorialで0割りが発生してないのなんで?

 何ぃ!?Factorialは引数0でも返り値が1になるのか・・ニクい配慮だ

 Apply版。つまり高階関数を使おうと思ったらいかにリストにするかって事ですかね(すでにCametanさんがレベル3の話で書かれていたけど実感しました)

 数学的スクリプトの遊び方を拝見して・・物理は(”も”)サッパリなんだ・・。遅延評価は是非ともやらんといかんだろうし、しばらく夜がヒマになるのでやってみるか・・。

 ところで、Racketの設定でカラーリングとか変えました。
 エヴァンゲリオン初号機のカラーリングが好きなので(^o^)




2022/05/19
 今夜はWIFIの効いた宿直部屋でプログラミングをやるぜ! とか思って到着すると、なんと入居者の方の中からコロナ陽性者が出て一時閉鎖とか。PCR検査だけやって帰ってきました。
 じゃあ家でCametanさんの練習問題に挑戦だ!と思ってたら珍しく父親が肩を緩めて欲しいという。更にしばらく宿直が無いと連絡を入れた方から「じゃあ今夜」というリクエストがあって終わったのが24時半・・・

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
 でもやっちゃう。うーん、楽しい。

 まずは分母の階乗の部分を別で作りまして・・。分子と分母の数字部分をリストで返すようにするには・・と部品を作って

 大まかな形はこういう感じかな?と思ったんだけど0割りが発生、あ、そうか・・じゃあ

 指数の数を引数にして合計を返す・・と。ちょっと強引だけどコレでどうだろう?一応、手計算での検算の結果は合ってるのだが・・

 ところで・・
「プログラミングする」ってこういう関数を作るって事で良かったのかな(^_^;)
 
 とにかく高階関数づくしでちょっと慣れてきました!


2022/05/18B
 え〜・・実は急遽ヘルプで宿直バイトに入ることになりまして。ここはWIFIが使えるのでRacket楽しんでます。

 まずはCametanさんに改良してもらった10進数化コードを読み解く。
 今見返しても見事ですよコイツは!もちろんコードコレクション入り

 そして破壊的操作をしないでリストで返す方法・・最初からリストに入れておくとは!!これもやられたなぁ・・こういう感動がクセになる

 あ、こうするのか・・以前もこの手の変換には苦労したような・・こちらもコレクション行きで。

 最後に僕バージョンの修正を・・衝撃告白なんですけど、丸写しじゃなくてちゃんと自分で考えてmap&lambdaで動くモノ書いたのって初めてです。

 おかげさまでとりあえず今日やりたかった事は終えられました、あ〜スッキリ。どこの世界にこんな優しい鬼が居ようか・・Cametanさんのおかげでむちゃくちゃ楽しくプログラミング学習させてもらってます m(_ _)m



2022/05/18A
 朝、帰宅してすぐにPCを起動。スタートアップにRacketを入れてるので強制的に画面が出るので、じゃあちょっとだけ・・って感じで。こういうすぐにいじれる環境にするの大事ですよね・・・
 というわけで、宿直明けで施術の時間までの時間制限つきで例の数学のヤツの続きをやってました。

 次は小数点のある10進数を2進数にするという・・小数点のある2進数とか考えたことも無かったw

 おおぅ・・入力が小数点ありなので返ってくるのも実数型じゃないか、見づらいw。そして破壊的操作にLoopの入れ子が面倒だということで並行して書いて最後にまとめて出力するという・・でも、こうやってかけるかな?ってのでちょっと実験的に書いてみたってのもあるので(^_^;) あ、出力自体はあってます、やったぜ!
 ところでLoop2の引数で(* f 2)って超見苦しいんですけど、これを
 うーん・・どうせまた勘違いしてるなこれは。夜の第二部で考え直してみよう。恐ろしい勘違いをしてる可能性あるな〜。考えられるのは・・tempの拘束をLoop内でやってるからかなぁ?


2022/05/17
 Cametanさんが石取りゲームの解答例を公開してくださってるのでチェック

 無駄がない! そしてプログラムを書いてゆく上での思考過程とかにまで言及していただいて・・ありがとうございます!なんか手がかりが無くてフワフワしてましたから・・今後、意識してやってみます!
 これも!

 解説もいただいてたのですが、拝見したのはバイトの待機中だったということもあり、自宅を出る前に気になった連想リスト検索の実験をやってみました。あ、やっぱ駄目なんですね。Pythonの辞書でも値からキーを探せたと思ったしあるかと思ったんですが、ここらへん無駄がないSchemeって感じですか!

 まさしく!Lambdaとか高階関数は避けてるつもりは無いのですが「思いつかない」って事は苦手意識があるんだろうな・・という推測でして。なんでもかんでもLambdaや高階関数を使う!くらいのつもりで場馴れしてゆくしかないか、と。



 エ、エレガント!なるほど〜・・いや、全然思いつきませんでしたw
 Foldlを使った例も提示していただいて・・m(_ _)m 明日の夜は時間があるので他のコードもいろいろと打ち込んで学習します(^o^) 

 あと、ほぼ関係ないんですがニコニコ動画でSchemeの動画があってちょっと見ました。どうせだったら何か動くものを作る過程が見たいなぁ・・





2022/05/16
 高校数学をPythonで・・に対してCametanさんからリアクションが(^o^)
 Pythonのは条件分けの列挙で突っ込まれると思ってました(^o^)
 

 Racketへの移植の解答例、あ!連想リストってこうやって最初にLetで設定しておけば良いのか・・

 なるほど!この解説は無茶苦茶合点が行きました!名前付きLetの使いどころがちょっと明確になった気がします(←危うい(^_^;)

 そこで折角なので続けて関数を移植してみようかと。Pythonの方はどっちみち理想的な書き方になってないようなので最初からRacketに移植のみということで・・

 16進数変換コードを写経させてもらいまして・・ふんふん


 16進数(以下ならば対応可能)から10進数への変換プログラムを・・テーブルを使って・・とやってみたんですけど、無茶苦茶苦戦しました。最初、実引数の部分を”A190”と文字列で入力するようにしてたんですけど
string->list だとリストには出来るけど (#A # #9 #) って感じになるもんですから、それを普通のシンボルとか数字に帰る方法がどうしても見つからなかったんです・・
 で、結局入力の段階でリストの形にしてもらうと言うことで・・。さて、41360は合っているのか!?


 おっしゃ! この調子で一冊まるごとやったら無意識で避けてるであろう連想リストとかLambdaにMapも使えるようになるんでは・・・と。
 
 あ!そう言えば・・連想リストってキーと値の逆の検索は出来ないのだろうか・・。Assocで値を検索してCarで取り出せたらキーが出せるならリストの使いまわしが出来るんだけど・・帰宅したら調べてみる!



2022/05/14
 KindleUnlimitedでこういう本があったので読み始める。持ち出し可能なChromebookはRacketやEmacsが使えないけどPaizaが使える・・ってことはPythonは動くので、出先での学習はいつか使うことになるPythonをやってみてもいいかな、と。

 2進数への変換コード。打ちはじめてびっくり、全然指が動かねぇ・・以前はPythonで学習をしてたのに全く分からなくなってるw

 今度は16進数変換コード。こういうアルゴリズムだったのか・・・これが分かってればX68000ももうちょっと楽しめた(かも知れない)のになぁ。

 帰宅後、Xubuntuを少々。ちょっといじっててスピードリーダーってのを発見。英文を入れると単語がフラッシュ暗算みたいな感じで表示されて強制的に速読が出来るというもの。目を動かす必要がないので有効という話は聞いたことがあったけど・・これ、良いかも知れんな!そのうちやってみるか・・

 せっかくなので16進数変換コードをRacketに移植してみる。上のLetはいらんかったな・・。とりあえずこれで動くので、ここから10〜15までの場合はABCDEFに変わるようにするには・・

 ここにConsの中でCondで分岐させれば良いのかな?と思ったら合ってた!なるほど、こうやって改造していけば良いのか・・・。あ、12〜は面倒なので省略。

 今話題のX68000にあやかって68000を変換してみる。これあってんのかなw。気まぐれにRacketでやってみたけどこれが思いの外楽しかったので、この本の内容を全部Racketに移植してゆくっての続けようかな・・いや、RoRもあるしLoLの移植もしたいし石取りのGUI版も作りたいし・・いや、プログラミング学習楽しいわ!


2022/05/12
 石取りゲームが自分の中では一段落ついたので、Ver3としてRacketのGUI版を作ってみようかなぁ・・・と。
 宿直中にはコードが打てないのでCametanさんの過去のプログラミング関係の記事で読み解きが出来そうなものを・・ということでWhiteSpaceをちょっと読んで見る。とりあえずこちらを一度Racketで打ち込みながら理解できるようにしてみるか・・。
 で、関数型言語脳テストというのがあったので帰宅後挑戦してみる。


 とりあえず思い浮かぶのはこういう形かなぁ・・

 ただ、出力のパターンを見ると、なんかどうも「Fold(Rかな?)」が使えそうな気配が・・?ちょっと挑戦してみたんですが・・無理でした(^_^;)

 あ、それとバイトの帰りに図書館でコンピューター関連の本棚を見ると
 こういうのがあって借りてくる。Linuxを使い始めたからにはコマンドラインを使いこなせないといけない・・ような気がする。こういうトレーニング系の学習は手に覚えさせるって事で有効そうな気がする。とりあえず明日からやってみよう



2022/05/11
 苦闘の記録ですw
 とりあえずCOM入力をランダム入力に変えてみると・・あれ?動くじゃないか・・あ、プレイヤー表示がワールド構造体更新後なのでズレる問題が・・。それに、なんだ!?石の数が減ってない!?

 あ、そうか。構造体の動作を確かめるつもりで動かしたから計算部分をまだ書いてなかったんだった(^o^)

 計算部分はこんな感じか・・とりあえず動いてます



 しかしCOMターンにどうしてもselectStoneが動かないので切り出してどんな返り値なのか調べることに・・0、ゼロ!?

 条件式に=を入れたら何故かうまく行ったので・・本体に戻してやってみたけど駄目。数値が帰ってるのは間違いないのに・・

 Condの文法がおかしいのか・・と散々悩むが駄目。気分転換にCOMの思考をちょっと書き直す。要するに相手に4の倍数+1で送り返せば勝ち確定なので・・もっとエレガントな書き方があると思うけどとりあえずコレで・・。COMは4の倍数+1で返ってきたら相手のミスを待つしか無いのでランダムで返します。あ、ランダムは  (+ 1 (random 2)) にしないと・・



 そしてついに動かない理由が判明!・・・仮引数にw入れただけで本体で実引数指定すんの忘れてた!!wって書いたから安心してしまったか・・こんな事で何時間も悩んでました・・・(・_・;)

 実験で対戦!強い、負けた! あ~やれやれ


2022/05/10
 では続きということで・・あ、ここでお知らせです!今回のVer2では最初に対戦回数を入力してどっちが何勝したか?ってのを表示するつもりだったんですが・・なんかREPLの入れ子にしないといかんのでは?と怖気づいて一発勝負に仕様変更しました(^_^;) まあ今回のが動いたらVer3で・・


 まず、ようやく気づいたんですけどw Eval部分、World-goの中に表示する部分を入れてるからおかしいって話だったのか!何のために構造体をPrintに渡してるんだ、と。

 じゃ、なんか出来たような気がするから実行してみるか・・・とりあえず1プレイヤーが入力するところまでは動いたのだが・・ここからバグ探しの旅が始まった

 うーん・・


 ええ〜?いや「w」つけてるけどなぁ・・

 COMの思考部分がおかしいのかと思って2プレイヤーも人間が打ち込むようにしてみたが駄目

 もしかしてLetで拘束しないといかんの?と思ってやってみたけど駄目。
 ここでお昼のバイトの時間となりましたんで一旦サスペンド。
 で!バイト中に「そ~言えばCametanさんがPrintの最後にwをそのまま渡してるって話あったな・・」と思い出して、立ち漕ぎで帰る!

 キターッ!! あ、メッセージに改行入れ忘れてる。なんで「最後にw」を渡さないといけなかったのかは後でじっくり考えよう。
 後はCOM操作にしてどうなるかだけど・・

 駄目だ〜w うーん・・Condの条件式の後は普通にS式で値が返りますよねぇ?と、ここで今日は終わり。



  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

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

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