星田オステオパシー

プログラミング学習日記 2022/06/24〜

2022/07/17
話題1 プログラミングの基礎の続き
 Mergeの実装。アルゴリズムさえ説明してもらえたら、基本そのまま置き換えるだけなので・・。最初から昇順並んでいるから簡単に理解できたな・・と思ったけど、ランダムでも昇順に並ぶようなのをかませば簡単になるということで分割するの大事って事なんですねぇ

 すんなりと1つ片付いたので例の場合分け成績関数の改善をちょっと考えてみることにした。Pythonの時に辞書、Schemeだと連想リストで・・ってのをCametanさんに教えてもらってたな!ということでリストのCDR部分にその後の手続きを入れておいて・・あ!

 そうかEvalに流し込んで実行させたら・・・?結局全然行数が減らないなwと思ったんですが、連想リストのCDR部をEvalで実行させるとか出来たら面白いかも・・と挑戦してみました
 が、駄目!

 このenvironmentの部分が意味不明。引数不足でエラーが・・うーん・・サンプルを見ても「モジュールです」とかあるんだけどますます?

 なんと言うかFormatみたいな感じで変数をぶっ込んで実行させるみたいなと言いましょうか

話題2 Cametanさんの充実記事、毎回ですがこんなに丁寧に解説してもらったりして良いのでしょうか・・甥っ子とかお客さんのお子さんとかがSchemeで分からないところがあって〜とか言い出した時のためにちゃんとまとめておこう、近いうちに

 とりあえずこちらは・・w ビックリするくらい見事に抜けてました。いつものパターンしか脳に認識されなかったんですね・・まさにパターンマッチングが行われてました!悪い意味で!


 述語?そんなのあったやろか・・

 と、思ったら謎の#tのところか!本来はそういう記述法なんですね(^_^;)
 make-なんとかもただのスタイルで構文じゃないとは・・

 ふうむ・・

 これは明らかにGaucheの書き方が分かりやすいですね!イメージとしては()がついてる方がイミュータブルっぽいですけど()でガードしてる感じで

 明日やります!

 そうなんです!最初構造体を使うか・・と思った時にワールド構造体(w←2つの意味で)を思い出してババ抜きを見に行きました、曖昧になってたので(^_^;) 
 なんですけど、構造体の要素に+するのが分からなかったんです(確か・・すでに記憶が曖昧)。結果、破壊的になったと

 これはいただいた例文でねっとり勉強させてもらいます(^o^)


 なるほど〜・・・と言いつつ、これは実際に困ってありがたみを感じないと本当には分かってないヤツなんで。いつか身にしみて分かると思います(^_^;)

 いや〜濃厚でした。じっくりやってみます! ありがとうございます〜



2022/07/16
話題1 Ideone
 Cametanさんからオンライン実行環境としてIdeoneを教えてもらいました。おおっ!OcamlもRakcetもある!けど、前にも教えてもらったのになんで使ってなかったのか・・あ・・

 思い出した・・エディタ部分で自動でインデントがつかない、実行すると画面が更新されて、そこで結果が表示される・・この僅かな一手間が使わない理由だったんでした・・。あと外観のカスタマイズが出来ないのも(なんかややこしい方法はあるっぽいけど)。言語のラインナップは魅力的なんですけどねぇ・・

話題2 Paiza ioを使って学習を進める

 という訳で・・とりあえずレコード形式を使って成績の集計を行うってのは・・うッ(;´Д`)・・動作するのは出来ました。
 ま、と、とりあえず動くものを作ってリファインは後で出来るから・・(set!以降、(loopの再帰の部分を関数にしようと思ったらhekka0-bの-bの部分を取り込んで実行するものを作れば良いんだろうけど・・Formatみたいな感じで変数を取り込んでそれを式として評価するものをって感じなのかな。明日の宿直時間でやってみるか・・
 追記:辞書!


 最低値関数のCametanさんオススメ版。ふうむ・・初期値が#fにすれば原作版みたいに上限限界値を設定しておかなくても良い、と。(or (not n)は・・#f対策かな?なるほど〜


 続いてCametanさんからmatchの例文をいただきました、ありがとうございます! ふ〜む・・


 あ、%は改行か。なるほどなるほど・・

 ふーん、なるほどなるほど。とりあえず自分で「これがやりたい」ってのをやろうと思って初めて頭に入るので、matchを使って後で何かやってみよう

 続きましてCametanさんからPrefixをFoldを使っての作例。そう、こういうのがやりたかったんです!初期値に足して、それを初期値にしてn番目のを後ろにつけてってのをやれば出来るな・・ってのは分かってたんですけどどう書けば良いのか分からなくてですねぇ・・そうか・・逆向きにconsされていくからcarすれば最ケツにアクセスできるか〜 そう考えると都合よく並んでるんですね。

 逆クォートの,の話、なるほど!こうやって初めて腑に落ちました。あ、そういう事か〜!むちゃくちゃ大事じゃないか(今更)!

 夜、暇だったので続き。プログラミングの基礎の続きでAppend。ちょうど良いのでMatchを使って教科書そのままで置き換えてみるか・・あれ?1は?

 そのままいつもの(if (null?を使った形にしたらちゃんと動くよなぁ?と言うか・・(・.・;) 結局いつものこの形で良くない?

 うーん、名前付きLet最高


2022/07/15
話題1 Cametanさんから重要情報をいただきました!毎度ありがとうございます!
 えっ!?そんな機能があったとは・・(-_-;) 明日試します!

 そしてこちら。Schemeのパターンマッチングは「コレちゃうねんなぁ」という代物だった・・と落胆した矢先だったので興奮。これも試してみます!しかしGaucheがあんまり海外でウケてないという話、折角ドキュメント英語なのに・・国内でウケてるということで日本語のドキュメントあればなぁ・・と思って調べ直したらドキュメントの日本語化、完了してないだけでした。たまたま僕が見たレコード型の部分が未訳だったんですね・・


話題2 Paiza ioで「プログラミングの基礎」をSchemeでの続き
 構造体の成績の数をカウントしていって表示するという課題。折角なので記録部分も構造体を破壊的に使ってみるか・・。表示が面倒なので独立させる。


 オンラインマニュアルで構造体の破壊的変更方法を確認。覚えられんw

 書き換えをしようと思ったらエラー。よく見るとdefine-record-typeの引数の部分を()でくるんだらミュータブルになるという記述を(今更)発見、書き換えに成功した。()のある無し両方書かれててなんで?と思ったらそういうことだったのか・・英語大事だなぁ
 これで後は場合分けして書き換え後再帰で回すようにすればオッケイだな?というところで図書館の閉館時間が参りました。続きは明日ということで

 

2022/07/14 本編
Chromebook大活躍。これとmineoのパケット放題のスマホがあればPaiza ioで学習はどこででも出来て良いなぁ

 プログラミングの基礎の続き。なるほどねぇ・・関数の入れ子、基礎がなってないよ基礎が。この形は苦手なパターンだな・・


 Letを使って再帰部分を束縛して再利用・・・随分前にLetの束縛宣言?内で再帰を回してるのを見て驚いた事があったけど普通のことなんですねぇ・・。なんか不思議な感じがするなぁ


 パターンマッチングについて曖昧だな・・と思ったので、教科書で表記法のおさらいをした後(ー>が曖昧だったので)、同じようなものがSchemeで無いのか?と検索すると・・今夜は宿直なのでこれをやってみよう!と。宿直に教科書を持ち込むのは面倒なんでね・・
 が・・いざ読み始めてみると・・「思てたんとちゃう」というヤツだった。名前は一緒だけどOcamlのとは別じゃないか。

 同じくお気楽さんのところでOcamlのパターンマッチングについての説明が。あ、なるほど・・条件分岐にリストの分解、言語化してもらってようやく概略が理解できた。


教科書ではまだ出てきてないけど面白いのでちょっとルールを見てみたり


 ほお〜・・面白そう。けどま、とりあえずSchemeとかRacketをちゃんとやれよ!と

 しょうがないのでKindleで例のPythonで数学のやり直しの本の続きを少し。よく考えたらグラフを描く部分を飛ばしてもそれほど問題が無いな。
 あれ?Rangeって無いのか・・という訳で適当に作ったりして進んでいくのでありました。

 ところで
 えっ!そうなんだ(・。・; 




2022/07/14 訂正編
 やっぱりSchemeで構造体をリストにして取り扱うってのが出来ないのはおかしい!と思って書き直してみたところ・・ちゃんと出来ました(^_^;) お騒がせいたしました・・Gauche最高。


2022/07/13
 やれやれ・・やっとこさ学習を再開出来ますよ。数学スクリプトはRacketが無いと出来ないので出先のChromebookで出来るのはScheme・・と言うことでOcamlで書かれてる学習内容をSchemeに解釈してやってく、と。



 ところでPaiza ioのSchemeがどの処理系なんだ?ってのが謎だったので検索したらちゃんと書かれたページがありましたw あ、Gaucheだったのか・・そりゃSRFIの導入方法がGaucheなはずだ・・

 という訳で「プログラミングの基礎」でのレコードを使った部分に入ってゆく。Gaucheのオンラインマニュアル、日本語を選んでもメニューが日本語なだけで本体は英語なんですよね。オプションの#t #tが謎・・ちょっと試したけどとりあえずどっちも#tにしておくと動くのでそれで良いか・・

 Ocamlのパターンマッチの代わりにletを使うことになると思うんだけど(いや、何かあるな・・また調べておこう)、そうするとスコープの問題で謎の階層構造に・・。あ、今更ながらですけど設定でフォントサイズとかテーマを変更出来るのを知ったので比較的好みのものにしてみる。


 学生のリストの中から特定の成績の人数をカウントする・・という関数なんだけど・・リストのリストを作ってそこから抜き出して・・ってのは楽勝だけど(と、言いつつGaucheって (car (car x みたいなのが出来ない? 更に (cdar も使えなかったり?でちょっと戸惑う。
 そもそもリストのリストじゃなくて構造体のリストを取りたいんだけど・・Ocamlはリストの中身が同じ型って決まってるっぽいので、駄目だけどSchemeとかだと擬似的に構造体的な事がリストで済ませられるっぽいなぁ?


 動かないのは分かってるけど、こういう感じで一気に構造体を作る方法とか無いものか?固有の名前で束縛しないといけないのでidを自動生成するようにすれば・・とか思ったけど・・出来たとしても面倒だなぁ


 それが駄目なら、こういう感じで束縛変数名でリストを作って・・とやりたいんだけど、これも出来ないっぽい?Racketは出来た気がするんだけど・・
 やっぱり出来ないはずがないと思って書き直したら出来ました(^_^;)


 という訳で帰宅してRacket起動。(car (cdr (car x を試す。あ、やっぱり出来るな。かっこ悪いけど。

 そうそう、この形がやりたかったのだ!Racket良いじゃない!
 ※Schemeでも出来るぞ!僕が間違って書いてただけ(^_^;)

 プログラミングの基礎の補助関数add to eachを作る。うーん・・こんな感じ?

 で、Prefix関数を教科書そのままでRacketで書くと・・こうなってしまった。うーん・・なんか他の方法で書けないかなぁ?

 アキュムレータを使って足していったら?と思ったけどw

 足して駄目なので引くことにした。与えられたリストの要素数と同じだけリスト内リスト(コピー)を作ってtakeで引いてゆくってので良いだろう、と。その為の補助関数copyを作る。これ、前から欲しかったんですよね!が、ちゃんと閉じたリスト内リストになってないので失敗です


 後方の「)」が余ってるけどどうせ前から処理するからいいやw。これを取り込んでtakeする関数を作れば・・

 まあ一応狙い通りの動きにはなってるな?

 リストを変えても動くのでこれにて落着とする。いや〜foldを使ってやってみたりしたんですけど思った形にならなくてですねぇ(^_^;)

 今日のまとめ
・Racket最高
・Paiza io結構かなり良い
・Ocamlはconsが直感的で分かりやすいかも知れない
・明日からはちゃんと教科書に沿ってやろう



2022/07/10
 いや、一昨日は忙しく、昨日はそれに加えて夕方人参を切ってたら腰がキューッと来てぎっくり腰一歩手前って感じで自己メンテしてました(ずっと「テスカトリポカ」のAudible版を聞いてたんだけど正直面白すぎて驚いた)。

 で、今日は宿直。腰痛は・・・もしかしたら中敷きも効果を発揮したかも知れなくて先程から全然大丈夫になった!

 あんまり座れないと思ってたのでLinuxマシンを持ってこなかったのでプログラミング学習無理か〜とか思ってたんですけど
 Paiza ioでSchemeがあるのでどこまで出来るかチェックしてみた。ぬぅ!case-lambdaも使えるとは!

 むぅッ!継続渡しスタイルも出来る!Lambdaがあるんだから当たり前か・・

 けど・・SRFIは使えないんだよなぁ・・前に試したから知ってるんだ。これさえ使えたらなぁ・・。Paizaで使えるとは検索しても出てこないけど・・
 scheme srfi how to use で検索すると処理系ごとに導入する方法が一覧で出てきた。ダメ元で全部やってみる?

 ファーっ!? なんとgaucheの書き方で導入出来てもた!おいおい・・これなら図書館だろうがフードコートだろうがプログラミング学習し放題だっての!
 やったぜ!Racket依存のは無理だけど、それもテキストエディタで書いといて帰宅してから検証すれば良いしな(今日は可能ならそうするつもりだった)。


2022/07/07
 面倒なのでやっぱりRacketに直してやってくか・・・と起動したのだが
 Cametanさんのローマ数字変換プログラムをちゃんと読まないままになってるのが気になって結局残りのマップ部分も打つ(じゃないと挙動が検証できなかったので(^_^;)

 あ、Lambdaで読む時点ですでにリストの1つめを抜き出してるってのはしっかり心に刻んでおこう

 おお〜 なるほど!

 はぇ〜そういう事か!見事だぁ〜。
 というかローマ数字の表記ルールとか全く知らんかった・・アラビア数字が発明されて良かった〜


 最初はてっきり「ヘンテコ関数」をネタ扱いで例題にしてはるんかと思ったんですが、これすごく大事そうなパターンですよね?コレクションさせていただきました(^o^)


2022/07/06
 浅井先生の「プログラミングの基礎」を読む。まあ、とりあえず一度ザッと通読してみるかと。
 Ocamlの環境、WindowsでもEmacsだったら作れるしなぁ・・・けどEmacs入れてるWindows マシンはネット機能が死んでるから・・とかOcamlの日本語情報サイトとか眺めたりして過ごす。

2022/07/04
話題1
 気づけばちょっと間が空いてしまった。継続渡し、お気楽さんのと作り方が違うよな?と気になってCametanさんのと並べてみる。単純に順番が逆になってるだけだが・・フィボナッチの場合は最後は足すだけだから順番が問題にならないけど、入れ子で配列的なものを作る場合はxy軸が逆転する・・はず?次回実験してみよう。

 Cametanさんの超CPS版フィボナッチのコードを拝見する。あ!この形は・・Actor理論の文書で見たぞ!?そして例の作り方を聞いたあとだとスラスラ読める。コツって大事だなぁ・・m(_ _)m

 その後適当にCPS方式で簡単な関数の書き換えをして・・と。そろそろ良いかな・・(早いw)。

 テスト駆動型に入っていくか!と。WinPCでもEmacsがあるのでOcmal使えそうな気がするけど、テスト環境があるんならやっぱりRacketだよなぁ・・ということでRacketでやっていきます!しかし・・Cametanさんのテストのサンプルがクラクラする長さだったのでw・・簡易版で。おお、プロンプトだけ!成功。なるほどねぇ〜

 本もようやく届いたんでね〜。

話題2
 一応、手打ちをしてなかった数日間もCametanさんの記事など拝見してました。

 おおっ!?確かにこう見ると何を悩んでたんだ・・って気になりますね!


 2回半読んだんですけど全然真髄に到達できてなかったです(^_^;) ちょっとこれを知った状態でもう一度読んでみようと思います!

話題3
 最近気に入ってるプログラミングに関連する動画です
 FC版ドラクエ3・4のチーフプログラマーだった内藤さんのYoutubeチャンネル。いやぁ面白いですねぇ!最初に買ったのがPC-6001だったってを先程知ったのですが・・同じ機械を持ってても違うもんだよ(^o^)! 入門書も無いので買ってきたクソゲーがひどい出来だったので改造するためにそのコードを見て勉強したんだとか・・ほぇ〜

 そしてこちらはニコニコ動画。「アルカディア」って言う、大昔にバンダイが出したクソゲームハード用のゲームを今更作るというw マジで大変だったんだな、昔のプログラマーは!まあ、それでもパンチカード使ってる時代に比べたら天国なんだろうけど・・。


 そういう意味ではこちらも衝撃。専門家でもコンパイラの挙動って動かしてみないと分からないという事か・・コンピューターって面白いなぁ




2022/06/30
話題1
 帰宅後、継続渡しの実験。あ、ふーん・・まあ、意味も分からずに書いてますw。

 形を整えようと思ったら結局再帰の形にするしかないか・・と。予想では40になるはずだけど?ん〜・・


 そうか・・zがContなんだからzを足せば・・なるほどねぇ・・ちょっと分かってきたかも?で、その後Cametanさんの記事を拝見する

 えっ(・_・;) なぬーっ!?lambdaって後ろに続くシンボル?を引数に取るんではないの?

 そしてこの世にこれ以上無いだろうってくらいに分かりやすい丁寧な解説を拝見した後に見返してみると・・世界がまるで違って見える(大げさ・・でもないか)!
 あ、でもひょっとして内側から引っ張り出してるから(fib (- n 2)がlambda (u)に入ってるのかな?いや、それもないか・・・これがルールなんだって事なら覚えるだけだから楽でいいけど。ほぇ〜・・



 ちょっと写経して終了。宿直中だったのでw。明日以降で書きまくろう!

 Cametanさんありがとうございました!!ビビるほど分かりやすかったです。そう考えると機械的に変換する部分で悩むのは無駄だな・・と思い知りました(^_^;)

話題2
 そろそろ「プログラミングの基礎」が届く頃だし、Ocamlのページも探しておくか・・と思ったら「お気楽プログラミング」さんにOcamlのページがあった。おお・・基本的なところだけでもさらっておくか・・とKindleへ送り込むのであった。

2022/06/29
 実はここ数日、継続渡しの学習をしてます。フィボナッチのCPS版・・うーん?これはいきなり複雑すぎるので基本から行こうw

 分かるような分からないような・・?なんでAddのCPS版はLambdaがいらないのか?Lambdaを使っても動きそうな気がするので明日チェックする

 階乗の計算、普通の再帰版を書いて見比べてみたりする。

 ネットで検索してみる。他のページの解説でピンとくるかも知れないと思ったので。うん?ちょっとピンときた

 結局色々と書いてみないと理解できないので、手当たり次第にCPS方式に直してみるか・・とまずは累乗をやってみよう。これは・・駄目じゃなw



 一つ前のベース部分、contだけで行けるのかな?と思ったら駄目だったのでとりあえず1を入れてみる。25か・・これは5x5だけしかやってないな。


 一応、n-1は進んでいる模様。累積させないといけないからなぁ・・

 Lambda(y)を使ってなんとか出来ないか?足してみると・・101w。ほーん・・


 ベースでcontに0を渡したら100。これは(5x5)がn回足されてるか・・。


 掛けてみたらどうなるんだろう?うぉ!25x25x25x25になっとる!もうちょいな予感


 来たっ!こんな簡単な形だったとは・・。結局のところ累積器として働いてるよなぁ少なくとも今回は。
 まあ片っ端からCPSで動くのを書いていけば近いうちに心底理解出来る・・かな?




2022/06/28
 メルカリにて浅井先生の「プログラミングの基礎」が送料込み1700円だったので結局買った(^o^)
 そして早くも学習が終わった後のことを考えている。
 地元の図書館に寄贈が受け入れてもらえれば最良(大阪府下で1冊も無いんだから貴重ですよ・・けど多分断られるだろうなぁ)。
 次善はバラしてスキャンしてデジタル化
 って感じかな?到着楽しみナリ

2022/06/27
 継続渡しの復習をちょっと。
 浅井健一先生の「プログラミングの基礎」を図書館で借りてみようかと思って予約をしたけど大阪府下で一冊も無いので無理だという(県外からだと送料が必要)。うーん、買おうか。読み終えたら地元の図書館で寄贈を受け付けてもらえたら言うこと無いんだけどなぁ。
 YoutubeでRacketの動画がないか?と検索。あるけど・・外国人の実況を動画で見ながら勉強になるとは思えず。娯楽的に元Racket開発コミュニティーに居た人の愚痴みたいな動画を見たがすぐ飽きる。

 改めて言うこともないけど、ゲームとか映画とかゲームブックとか・・他の娯楽を始めたらプログラミング学習とか無理だろwと。ま、生存報告ということで

2022/06/24
 ようやくOcamlのサポート動画を全部見終わった。いやすごく勉強になった!
 デザインレシピはもちろんなんですけど、特にハッ!としたのはMapの解説。あ、そういうことか!「一般化」ってのは改めて言われると当然のごとく感じるんだけど、そういう理解をしてなかった・・


 そこからその他の高階関数ってことでFoldに関しての説明も良かった・・。NHK教育みたいな感じの淡々とした喋りなんだけど、ところどころ「グン!と良くなります」と感情を込めるのがアクセントになってます

 ここからはデザインレシピをRaketに対して使って意識しながら色々とやってみよう。一度流しただけでは全然なので・・。CDRなのリストは短くなり、いずれ終了することが約束されているとか・・なるほど!だったら他にも要素を減らす仕組みがあれば再帰で書けるのかとか(前にRemoveでCarを消すってのもそうでしたね)。改めて言われるとハッ!とする事多かったです。
 先生のページを見ると研究されてる内容(2021年)を見ると
  • 限定継続演算子の理論と実装
  • 定理証明系を使った各種性質の証明
  • 証明木の可視化
  • 初心者プログラミング教育(OCaml Blockly、型デバッガ、ステッパ)
  • ゲーム開発用 universe ライブラリ
  • OCaml Blockly を使った中高の学習教材開発
 とかあるので、なるほど教えるプロの中のプロなのか、と。

 この辺は明らかに苦手意識がある。Cametanさんの過去記事をKindle化して読み込もう。



 あ、ヒープってそういう事か・・まあいつか使う日が来るかなぁ?ちょっと調べたらメモリの効率的な活用みたいな話で・・・まあ、さし当たって縁が無さそうだ。

 そして例外処理。ああ、勘違いしてた!Raise(確かRacketにもあった)ってエラーの実験のために例外(エラー?)を起こす命令だと思ってたんだけど、起こる例外(エラー?)に任意で名前をつけて対応策を決められるのか!デバッグ用のツールだと思ってましたわ。

 という訳で、とにかくまずはデザインレシピの癖をつけるようにやっていこう

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

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

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