裂け目は、コードの重複を最小限にするための非常に便利なコンビネータです。私はAbundant, Perfect, Deficient numbersを分類するとします:「実行時に計算値にクリーブを適用することはできません」ので実行時の計算値を切り捨てますか?
USING: arrays assocs combinators formatting io kernel math
math.order math.primes.factors math.ranges sequences ;
IN: adp
CONSTANT: ADP { "deficient" "perfect" "abundant" }
: proper-divisors (n -- seq)
dup zero? [ drop { } ] [ divisors dup length 1 - head ] if ;
: adp-classify (n -- a/d/p)
dup proper-divisors sum <=>
{ +lt+ +eq+ +gt+ } ADP zip
H{ } assoc-clone-like at ;
: range>adp-classes (n -- seq)
1 swap 1 <range> [ adp-classify ] map
ADP dup
[
[
[ = ] curry
[ count ] curry
] map
cleave 3array
] dip
swap zip H{ } assoc-clone-like ;
: print-adp-stats (seq --)
ADP [
[ dup [ swap at ] dip swap "%s: %s" sprintf ] curry
] map cleave
[ print ] [email protected] ;
range>adp-classes
はコンパイルされません。
私は、劈開を使用できない場合は、私は基本的にしなければならない。
[ [ [ "deficient" = ] count ]
[ [ "abundant" = ] count ]
[ [ "perfect" = ] count ]
tri
] dip
ラメと長く、キー文字列の配列が長かった場合、本当に醜いと長くなるだろうどの。また、キーの配列が実行時に生成される場合、重要なことに、切断せずに実行することは不可能です。 print-adp-stats
のための同様
:cleave
せずに私は、このリテラルが私の元に転がっていなければならないでしょう:
{
[ "deficient" dup [ swap at ] dip swap "%s: %s" sprintf ]
[ "perfect" dup [ swap at ] dip swap "%s: %s" sprintf ]
[ "abundant" dup [ swap at ] dip swap "%s: %s" sprintf ]
}
グロス。
cleave
を実行時の計算値に置き換えるコンビネータはありますか?実行時に計算を許可しながら、醜い複製を他の方法で最小化することはできますか?