F# で Cmdlet を書いてる pt.53
krymtkts/pocof 開発をした。
その前に、毎年恒例 .NET の新しい major が出ましたな。
What's new in F# 9 - F# Guide - .NET | Microsoft Learn
Nullable reference がでかいのかな。 リリース後ブログになってたし。 Nullable Reference Types in F# 9 - .NET Blog
個人的には Enforce attribute targets はよく間違うのでありがたそう。
pocof 的には Optimized equality checks Field sharing for struct discriminated unions あたりの IL の改善が効果でたらうれしいな。 equality の最適化は半年ほど前ブログにもなってて、すご...と思ったやつだ。 F# developer stories: how we've finally fixed a 9-year-old performance issue - .NET Blog
Enhancing #help in F# Interactive - .NET Blog もブログになってたやつ。 Extended #help directive in fsi to show documentation in the REPL 早速使ってみてる。
先に .NET の最新リリースに触れたが、 pocof でも毎年恒例の .NET 更新をやりたいので、それに合わせて今着手中の開発を一区切りして 0.17.0 でリリースした。
含まれるのは、 word 操作。これは自分の日常使いで早速使い込む予定。 あとはキーに対応づいた操作の、内部コードのリファクタリングをしてた。 例えば、対称な処理が個別の実装になってるのを 1 つにまとめたり。 クエリ文字列を操作するあたりはまだゴチャついてて、もっとよくできる直感があるけど、リリースのために後回し。
リリース自体は問題なくいったのだけど、リリース前に既存バグを見つけたので、リリース後にその対処をした。
ずっと気づいてなかったが、 pocof のいくつかの option に $null
を渡すと validation されてなくて NullReferenceError
が出たりしてたので、カッコ悪かった。
とりあえずこいつは直した。 #261
その過程で知ったのだけど、 pocof
の switch parameter に $null
を渡したら truthy な動作をするのよね。
なんとなく $false
が渡されたときみたいな挙動になるのかと思いきや、 $true
を渡されたような挙動になる。
あんまり switch parameter に $null
を渡すような変なことしないようなので、以下の辺りがわたしが探してることに近そうかな...という感じはしてるが、まだよくわかってない。
この件に関しては大した情報もなさそうやと思ってコード見に行ったのだけど、まだ追いきれなくてよくわからんかった。この辺は宿題としたい。 一応 PowerShell で簡易的に switch parameter の挙動をチェックする PowerShell の関数を作ったのだけど、こいつだと falsy な挙動になる。なんでや...ひょっとしたら pocof のバグなんかも。 あるいはバイナリ Cmdlet だと違うとか?めんど...宿題。
function test-switch ([switch]$Switch) {
"is null=$($Switch -eq $null)"
"is false=$($Switch -eq $false)"
"is true=$($switch -eq $true)"
"isPresent=$($Switch.IsPresent)"
}
# 狂気のワンライナー
Write-Host 'plain'; test-switch -Switch; Write-Host '$false'; test-switch -Switch:$false; Write-Host '$true'; test-switch -Switch:$true; Write-Host 'null'; test-switch -Switch:$null
# plain
# is null=False
# is false=False
# is true=True
# isPresent=True
# $false
# is null=False
# is false=True
# is true=False
# isPresent=False
# $true
# is null=False
# is false=False
# is true=True
# isPresent=True
# null
# is null=False
# is false=True
# is true=False
# isPresent=False
続く。