PowerShellでtakeWhile
PowerShellのbreakは、
パイプ処理を、先行する関数を含めて途中で止める
効果があると知った。
参考:
http://d.hatena.ne.jp/NyaRuRu/20080112/p1
http://mojibake.seesaa.net/article/78084208.html
そこで、HaskellのtakeWhileらしきものを実装してみた。
といっても2行。スクリプトブロックがfalseを返したらbreakするだけ。
止められると分かれば、安心して無限ストリームを生成する関数が書ける。
enumFrom nはパイプにn, n + 1, n + 2...を流す関数。明らかに無限ループ。
ただし、バージョンの違いはよく理解していない。とりあえず以下のスクリプトは
1.0, 2.0で同様の出力をした。
function Main { enumFrom 10 | takeWhile {$_ * $_ -lt 200} 1 .. 100 | takeWhile { Write-Host "hoge"; $false } 1 .. 100 | % { Write-Host "hoge"; break } } filter takeWhile([ScriptBlock] $script) { if(!(& $script)) { break } $_ } function enumFrom([int] $n) { $count = $n while($true) { $count $count++ } } . Main
実行結果
10 11 12 13 14
Write-Hostもキャンセルされる。