Go to the first, previous, next, last section, table of contents.

### オプション指定

ユーザ定義関数が 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.