argn 関数コールの入力/出力引数の数を返す

## 呼出し手順

               [lhs, rhs] = argn()
                lhs = argn(1)
                rhs = argn(2)

## 設定

lhs

  Number of expected Left-Hand-Side output arguments. Is set to 1 when no output argument is expected.

rhs

  Number of Right-Hand-Side input arguments provided in the function call.

## 説明

この関数は関数定義の内部で使用されます. この関数は関数がコールされた際に関数に指定された実際の入力引数(`lhs`)と 出力引数(`lhs`) の数を出力します. 通常,関数の定義においてオプションの引数を処理する際に使用されます.

Testing the existence of a named input argument with `isdef(..,"l")` is more robust that with `argn()`. Please see examples.

## 例

Simple examples:

    function [res, res2] = test(a, b)
      [lhs, rhs] = argn()
      [res, res2] = ("abc", %pi);
      disp([lhs rhs])  // <<<<<<<<<<<
    endfunction

    test();
    test(4.321);
    test(3, -1);
    test(3, -1, a=0);
    test(3, -1, c=8);

    out1 = test();
    [o1, o2] = test(%pi);

    --> test();
       1.   0.

    --> test(4.321);
       1.   1.

    --> test(3, -1);
       1.   2.

    --> test(3, -1, a=0);
    Wrong number of input arguments.

    --> test(3, -1, c=8);
    Wrong number of input arguments.

    --> out1 = test();
       1.   0.

    --> [o1, o2] = test(%pi);
       2.   1.

With varargin and varargout:

    function [res, varargout] = test(a, varargin)
      res = "abc";
      varargout = list(%i);
      [lhs, rhs] = argn()
      disp([lhs rhs])  // <<<<<<<<<<<
    endfunction

    test();
    test(4.321);
    test(3, -1);
    test(3, -1, a=0);
    test(3, -1, 8);

    out1 = test();
    [o1, o2] = test(%pi);
    [o1, o2, o3] = test(%pi);

    --> test();
       1.   0.

    --> test(4.321);
       1.   1.

    --> test(3, -1);
       1.   2.

    --> test(3, -1, a=0);
       1.   3.

    --> test(3, -1, 8);
       1.   3.

    --> out1 = test();
       1.   0.

    --> [o1, o2] = test(%pi);
       2.   1.

    --> [o1, o2, o3] = test(%pi);
       3.   1.

Robustly testing the existence of input arguments:

    function res = test(a, b, varargin)
        res = ""
        if isdef("a","l")
            res = "a passed."
        end
        if isdef("b","l")
            res = res + " b passed."
        end
        if isdef("c","l")
            res = res + " c passed."
        end
    endfunction
    clc
    test()
    test(4.321)
    test(4.321, %z)
    test(b=3)
    test(c=3)
    test(-1, c=3)
    test(-1, a=2, c=3)
    test(b=-1, a=2, c=3)

    --> test()
     ans  =

    --> test(4.321)
     ans  =
     a passed.

    --> test(4.321, %z)
     ans  =
     a passed. b passed.

    --> test(b=3)
     ans  =
      b passed.

    --> test(c=3)
     ans  =
      c passed.

    --> test(-1, c=3)
     ans  =
     a passed. c passed.

    --> test(-1, a=2, c=3) // argins in varargin are/become always anonymous
     ans  =
     a passed.

    --> test(b=-1, a=2, c=3)
     ans  =
     a passed. b passed.

Another usage:

    function concat=myOwnFunction(name,optional)
      [lhs,rhs] = argn()
      if rhs <= 1 then
         optional="my Optional value"
      end
      if rhs == 0 then
         error("Expect at least one argument")
      end
      concat=name+" "+optional
    endfunction

## 参照

- isdef
- varargin
- varargout
- macrovar
- function