関数の戻り値型から空配列の型解決

なんのこっちゃか分かりにくいけど
戻り値の型から空配列の型解決ができるようになった
f:id:zenu:20170913204222p:plain

型解決をするために配列を正規化している

return([])
↓
$0 = []
return($0)

これをやると問題になるのがこんなやつ

xs = [Int]()
↓
$0 = [Int]
xs = $0()

Intってのが型解決してみるまで変数なのか型なのか分からないので$0が配列型か配列か分からない
ってゆーか、変数に型の代入ができなかった


Nodeにインスタンスか型なのかのフラグを付けて対応したけど、これができひんのは分かっている
どうしようもないので後で考える

var xs = []
xs.Add(Int)
var i = xs[0]()

ブラックジャックの点数

ブラックジャックの点数を数えるプログラムが思ってたのと全然違った
employment.en-japan.com

Aを2回以上11と数えるとバースト確実やねんから
Aの枚数=Aの合計値とみなしてかまへん

Aの枚数とA以外の合計値を求め、合計値-1が10以下ならA1枚を11とする
他はAを1と数えるだけでいい

せやないと6個のデッキをごちゃまぜにしてプレイしたときの
エース21枚という合法手に対し計算がややこしくなるやん(するかい、そんなん)

sumHand2 :: [Card] -> Int
sumHand2 cards | as == 0           = ax
               | ax + as - 1 <= 10 = ax + as - 1 + 11
               | otherwise         = ax + as
               where (a, xs) = partition (== A) cards
                     ax      = sum (map toPoint2 xs)
                     as      = length a

toPoint2 :: Card -> Int
toPoint2 A     = 1 -- 不要だけど書いておく
toPoint2 (N n) = n
toPoint2 _     = 10

そういえば練習でポーカーの手役を判定するプログラムと麻雀のシャンテン数を数えてたけど
作り途中でほっぽったのはどこ行ったんだろう
前のPCの中かな?

関数内型定義

関数内で型が定義できるようになった
インナー関数が作れたついでにやってみたらすぐできた
メソッド的なものは作るつもりはないので大体そろった感じ
f:id:zenu:20170903023907p:plain
次はなにつくろっかなー
例外関係かな

空気を読んだ関数のオーバーロード

関数の戻り値から関数のオーバーロードができるようになった
いゃったぁ!
こんな書き方しないけど!

f:id:zenu:20170902132721p:plain

今までインナー関数はマングリング(?)してグローバル関数として作っていたけど
returnを関数として実装している都合、関数毎にインナー関数用のスコープを持たせることにした

弟切草

叔父が亡くなって洋館を相続したので、彼氏と見学に行く
実は叔父が実の父で、なんか有名っぽい画家だったらしい
洋館を探索してるとミイラを見つけてしまい、逃げようとするけど車が倒木直撃し大破
管理人に襲われ、管理人室を見つけると監視カメラが全室に仕掛けられていた
管理人が彼女の妹(のような弟)で彼氏をクロスボウで射抜き、姉に父の絵を完成させるように迫る
絵が目を潰し炎に焼かれる絵なので、その通りにし館全焼


そこで終わってりゃいいものを、ゲームのプレイオチで、彼氏が助けて生き延びるシーンも見る


低予算を無理矢理誤魔化しました感が隠しきれてない
原作ゲームだからってそっちのオチに持ってくこと無いだろうに…

空配列の型解決

空配列の使っているところを見て型推論っぽいのをできるようにした
型解決がその場しのぎで、つぎはぎだらけのよく分からないものになっていく

f:id:zenu:20170817161959p:plain


大して関係ないけど、WSHの↓が動かなくなっていた
echoなんてコマンドないって怒られる
変わったことと言えばWin10のパッチ位だと思うんだけど・・・なんかやったっけ?
× WScript.CreateObject("WScript.Shell").Exec("echo a");
○ WScript.CreateObject("WScript.Shell").Exec("cmd /c echo a");

戻り値だけ異なる関数のオーバーロード

戻り値だけ異なる関数をなんちゃって型推論して解決することができた
約1年越しにほっといた機能を夜中のテンションで作成
元は数値型をIntかFloatかShortなどなど、使っているところから推論したいってのが始まり
まだそっちはできてないので何とか考える

f:id:zenu:20170817032059p:plain

欠点は引数が同じで戻り値ありの関数と無しの関数をまぜて、戻り値を使わない場合が判別不可
無理矢理戻り値無し関数を呼んだことにしてもいいけど、エラーにしたほうがいいか?
まぁどうでもいいや