functions Scilab プロシージャおよび Scilab オブジェクト

## 説明

functions は Scilab プロシージャです "macro", "function" および "procedure"は同じ意味を有します).

## 関数定義

通常,これらはエディタによりファイルで定義され, exec関数またはライブラリ (lib または genlib参照) によりScilabにロードされます. しかし,オンライン定義 (deff または function参照) することも可能です. 関数は以下の2つの要素により定義されます::

- 以下のような "構文定義" 部:

      function [y1,...,yn]=foo(x1,...,xm)
      function [y1,...,yn,varargout]=foo(x1,...,xm,varargin)

- 一連のScilab命令.

"構文定義" 行はこの関数の"完全な"呼び出し手順を指定します. `yi` は,入力変数`xi`と その関数が実行された際にScilabに存在する変数の関数として 計算される出力変数です.

## 呼び出し手順

- 通常,関数の呼び出し手順は `[y1,...,yn]=foo(x1,...,xm)`となります. 入力または出力引数の一覧を定義より短くすることができます. このような場合, 左辺の先頭のいくつかの変数のみが使用され設定されます.

  呼び出し時の引数の実際の数は, argn により取得することができます.

- 入力または出力最大引数の数が不定の 関数を定義することができます. これは, vararginおよび varargoutキーワードを 使用して行います. 詳細は指定したリンクを参照ください.

- 入力引数を指定する際に"名前付きの引数"を使用することも 可能です: 関数`fun1`が `function y1 = fun1(x1, x2, x3)`と 定義されていると仮定すると,`fun1`を `y = fun1(x1=33, x3=[1 2 3])`のような 構文でコールすることもできます. x2 は未定義となります.

  `y = fun1(x1=33, y='foo')`のような構文で コールすることも可能です. このような場合,`y` 変数を 関数`fun1`のコンテキストで 利用可能となります.

  引数の最大数は関数構文部で使用される 形式的な入力引数の数以下とする必要があることに注意してください.

  定義された変数を exists 関数で 確認することができます.

- 関数が左辺の引数を有さず, 文字列引数でのみコールされた場合, 呼び出し手順を以下のように簡単化できます:

      fun('a','toto','a string')

  は以下と等価です:

      fun a toto 'a string'

## その他

関数はScilabオブジェクト(型番号は13または11)です. 関数は他の変数型と同様に操作 (構築, 保存, 読込み, 引数として指定)できます.

関数の集合は,ライブラリに集約できます. `%` 記号で始まる関数 (例: `%foo`) は,しばしば新しいデータ型について演算子や関数をオーバーロード (オーバーローディング参照) する際に使用されます.

関数名はいくつかの構文規約 (names参照)に従う必要があることに 注意してください.

## 例

    //インライン定義 (function参照)
    function [x,y]=myfct(a,b)
      x=a+b
      y=a-b
    endfunction
    [x,y]=myfct(3,2)
    //インライン定義 (deff参照)
    deff('[x,y]=myfct(a,b)',['x=a+b';
                             'y=a-b'])
    // アスキーファイルで定義 (exec参照)
    exec SCI/modules/elementary_functions/macros/asinh.sci;

## 参照

- function
- deff
- exec
- lib
- getd
- genlib
- exists
- varargin
- varargout