ユーザ定義関数が N 変数で宣言された場合, その関数は, N 変数での呼び出しのみが許される.
[0] def factor(A) { return fctr(A); }
[1] factor(x^5-1,3);
evalf : argument mismatch in factor()
return to toplevel
不定個引数の関数をユーザ言語で記述したい場合, リスト, 配列を用いることで 可能となるが, 次のようなより分かりやすい方法も可能である.
% cat factor
def factor(F)
{
Mod = getopt(mod);
ModType = type(Mod);
if ( ModType == 1 ) /* 'mod' is not specified. */
return fctr(F);
else if ( ModType == 0 ) /* 'mod' is a number */
return modfctr(F,Mod);
}
[0] load("factor")$
[1] factor(x^5-1);
[[1,1],[x-1,1],[x^4+x^3+x^2+x+1,1]]
[2] factor(x^5-1|mod=11);
[[1,1],[x+6,1],[x+2,1],[x+10,1],[x+7,1],[x+8,1]]
2 番目の factor() の呼び出しにおいて, 関数定義の際に宣言された引
数 x^5-1の後ろに |mod=11 が置かれている. これは, 関数実行時
に, mod という keyword に対して 11 という値を割り当てること
を指定している. これをオプション指定と呼ぶことにする. この値は
getopt(mod) で取り出すことができる. 1 番目の呼び出しのように
mod に対するオプション指定がない場合には, getopt(mod) は型
識別子 -1 のオブジェクトを返す. これにより, 指定がない場合の動作を if 文
により記述できる. `|' の後ろには, 任意個のオプションを, `,'
で区切って指定することができる.
[100] xxx(1,2,x^2-1,[1,2,3]|proc=1,index=5);
さらに, オプションを key1=value1,key2=value2,... のように
`,' で区切って渡す代わりに, 特別なキーワード option_list
とオプションリスト [["key1",value1],["key2",value2],...]
を用いて渡すことも可能である.
[101] dp_gr_main([x^2+y^2-1,x*y-1]|option_list=[["v",[x,y]],["order",[[x,5,y,1]]]]);
特に, 引数なしの getopt() はオプションリストを返すので,
オプションをとる関数から, オプションをとる関数を呼び出すときには有用である.
% cat foo.rr
def foo(F)
{
OPTS=getopt();
return factor(F|option_list=OPTS);
}
[3] load("foo.rr")$
[4] foo(x^5-1|mod=11);
[[1,1],[x+6,1],[x+2,1],[x+10,1],[x+7,1],[x+8,1]]
Go to the first, previous, next, last section, table of contents.