bjam AdC jp 2011 13日目
死にそう...
select-highest-ranked rule
時間もないしネタもないし前回飛ばしたこいつを見てみます。
と言ってみたものの、よくよく考えるとそれほど面倒ではないです、、、
rule select-highest-ranked ( elements * : ranks * )
です。
ここでelementsは対象となるsequenceですが、ranksはelementsと同じ要素数を持つ数列です。
数値でなくても構わないですが、内部でsequence.max-elements/sequence.lessを使用するのでsequence.lessが常に偽を返すことになり意図しない結果になるかも知れません。
まず、ranksは
local max-rank = [ max-element $(ranks) ] ;
で最大の要素が抽出されます。ここで、max-elementにはordered引数を渡せないので、前述のように数列である必要があります。
elementsとranksを順に先頭から走査し、max-rankと等しい場合結果のsequenceにpush_backするという操作を最後まで行ないます。つまり特殊なfilterです。
e.g.
sequence.select-highest-ranked foo bar baz qux quux corge grault garply waldo fred : 1 1 1 2 2 2 3 3 3 3 ; # => grault garply waldo fred
sequence.select-highest-ranked foo bar baz qux quux corge grault garply waldo fred : 1 3 2 1 1 3 2 3 2 1 ; # => bar corge graply
さて、、、これビルドツールとして必要か???
あまりに少ないので、
前回最後にちらと説明した組み込みのsequenceの操作に関しても少し説明します。
例えば以下のコード
hoge = 0 ; ECHO $(hoge) ; hoge = -1 $(hoge) ; ECHO $(hoge) ; hoge += 1 ; ECHO $(hoge) ; hoge -= 1 ; ECHO $(hoge) ;
は次の結果となります。
$ bjam -f hoge.jam 0 -1 0 -1 0 1 hoge.jam:7: in module scope rule hoge unknown in module
再代入、末尾への追加はありますが、メンバを要素を取り除くのはないようです。select-highest-rankedの出番ですかね...
sequenceの先頭からの走査は
seq = ... ; head = $(seq[1]) ; tail = $(seq[2-]) ;
を使えばできますし、走査が終了したかどうかはseqを単にconditionに突っ込めば問題ないです。
seq = ... ; while $(seq) { elem = $(seq[1]) ; ... some process ... seq = $(seq[2-]) ; }
と言った感じです。
いい感じに空間を潰せたのではないでしょうか。