にゃははー

はへらー

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-]) ;
}

と言った感じです。

いい感じに空間を潰せたのではないでしょうか。