12. その他の操作(Other Operations)

1. 関数作用素 (Functional Operations)

次の作用素は新しい関数を別の関数またはオブジェクトから作るのに用いられる。 しばしば Dylanコンパイラはこれらの作用素について特別の知識を持ち、 効率的なインラインコンパイルを行うことができる。

compose function1 #rest more-functions => function [Function]
ただ1つの引数で呼ばれたときにはcomposeはその引数を返す。

2引数で呼ばれた時には、composeは次のような関数を返す: 渡された引数に(composeの)2番目の関数を適用し、 その(ただ一つの)結果の値に最初の関数を適用する。

3つ以上の引数で呼ばれた時には、一つの合成関数が得られるまで、 composeは引数の組を合成する。 (組を作る順序を左からにするか右からにするかは、 適用順序さえ守られれば問題にはならない。)

? define method square (x :: <number>) x * x end;
square
? define method square-all (coords :: <sequence>) 
      map (square, coords);
  end;
square-all
? define method sum (numbers :: <sequence>)
      reduce1 (\+, numbers);
  end;
sum
? define constant distance = compose(sqrt, sum, square-all);
distance
? distance ( #(3, 4, 5) );
7.0710678118654755
complement  predicate => function  [Function]
complementpredicateを引数に適用する関数を返す。 predicate#fを返すなら、complementは#tを返す。 そうでないなら、complementは #fを返す。例えば、odd?complement(even?)と定めることもできるであろう。

? map (female?, list (michelle, arnold, roseanne));
#(#t, #f, #t)
? map (complement (female?), list (michelle, arnold, roseanne));
#(#f, #t, #f)
disjoin predicate1 #rest more-predicates => function [Function]
disjoinは一個の関数を返す。これは、引数として渡された関数(達)の 選言(disjunction)と称される。選言は任意個数の引数を受理し、 述語を引数に順に適用する。どれかの述語が真を返したなら、残りの 述語は(もしあっても)適用されず、真が返る。そうでなければ、 すべての述語が適用され#fが返る。

選言は述語への|表現の呼び出しに類似である。

conjoin predicate1 #rest more-predicates => function [Function]
conjoinは一個の関数を返す。これは、引数として渡された関数の連言(conjunction)と 称される。連言は任意個数の引数を受理し、述語を引数に順に適用する。どれかの述語が #fを返したなら、残りの述語は(もしあっても)適用されず、#fが直ちに返る。 そうでなければ、すべての述語が適用され、最後の適用の結果が返る。

連言は述語への&表現の呼び出しに類似である。

curry function #rest curried-args => new-function [Function]
currycurried-argsにそれ自身の引数を順に足し、それにfunctionを 適用するような関数を返す。例えば、curry(\=, "x")は文字列 "x"と等しいか どうかのテストをする述語である。curry(\+, 1)は増加関数である。 curry(\>, 6)は6より小さい値に対して真を返す述語である。 curry (concatenate, "set-")は文字列"set-"を、渡された追加の任意の列に 連結する関数である。

? map (curry (\+, 1), #(3, 4, 5))
#(4, 5, 6)
rcurry function #rest curried-args => new-function [Function]
rcurry(right curryを意味する)は、functionの最左の引数ではなく、 最右の引数があらかじめ指定される点を除いて、curryと全く同様に作用する。 例えば、rcurry (\>, 6)は 6より大きい値に対して真を返す述語である。

? define constant yuppify = rcurry (concatenate, ", ayup");
yuppify
? yuppify ("I'm from New Hampsha");
"I'm from New Hampsha, ayup"
always object  => function [Function]
alwaysは任意個の引数で呼べる関数を返す。その関数は引数を無視して常に objectを返す。

? always (1) ("x", "y", "z")
1
? always (#t) (#f, #f)
#t

2. 関数適用 (Function Application)

apply  function #rest args   => values	[Function]
applyargsを引数としてfunctionを呼び出す。argsの最後の要素は列で なければならない。その列の要素は分解され、一つ一つがfunctionの引数となる。

? apply(\+, #(1, 2))
3
? 1 + 2
3
? define constant math-functions = list (\+, \*, \/, \))
? math-functions
#({generic +}, {generic *}, {generic /}, {generic })
? first (math-functions)
{generic +}
? apply (first (math-functions), #(1, 2))
3

3. 恒等関数(Identity function)

identity  object   =>  object	[Function]
identityは単に objectを返す。
目次 索引 コンディション(次章)