関数の引数の数に制限があるのはなぜですか?


7

私は読ん:help :callでいます、それは次のように述べています:

関数を呼び出します。関数の名前とその引数は、で指定したとおり:functionです。最大20個の引数を使用できます。

これは私を不思議に思います:なぜ関数の引数の数に一見人為的な制限があるのですか?


この場所は決して公式ではありません。vim_devメーリングリストに質問したり、ソースを読んだりしましたか?
romainl 2016年

...後者はもちろん答えです:「それがそれが作られた方法だからです」:D
VanLaser 2016年

2
また、N個を超える引数が必要な場合は、代わりにリストまたは辞書関数の引数を使用することは、明らかに代替の(より組織化された)ソリューションであると主張することもできます。「20」はこのソリューションの「強制」制限です:)
VanLaser 2016年

2
ここでは、引数の絶対最大数は4であることを宣言します。
romainl 2016年

4
「まずあなたは聖なる機能を取り出し、それからあなたは3つまで、それ以上でもそれ以下でもない論拠を数えなければならない。3はあなたが数えるべき数であり、数えられる数は3であろう。4つは数えるべきではない。あなたが3に進むことを除いて、あなたは2を数えなさい。5は正解です。3番目の数である3に達したら、あなたのアンティオキアの聖なる機能をあなたの敵に向かって呼び寄せてください。返して」
muru、2016年

回答:


13

これは、関数の引数を格納するために使用されるデータ構造のサイズだからです。からeval.c

#define MAX_FUNC_ARGS   20      /* maximum number of function arguments */

/* structure to hold info for a function that is currently being executed. */
typedef struct funccall_S funccall_T;

struct funccall_S
{
[..]
    listitem_T  l_listitems[MAX_FUNC_ARGS];     /* listitems for a:000 */
[..]
};

[..]

/*
 * Allocate a variable for the result of a function.
 * Return OK or FAIL.
 */
    static int
get_func_tv(
)
{
    typval_T    argvars[MAX_FUNC_ARGS + 1];     /* vars for arguments */

[..]

    /*
     * Get the arguments.
     */
    argp = *arg;
    while (argcount < MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc))
    {
[..]
    }
}

まあ、など。

これを動的にして、任意の量の引数を許可できますか?承知しました。しかし、なぜ?

fun! TooManyForSanity(one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twentyone)
    echo "Well..."
endfun

call TooManyForSanity('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty', 'OH MY GOD IT NEVER ENDS')

これは、プログラマーが無邪気なバニーを眠り狂わせて殺すようなコードです。


2
重要な質問は次のとおりだと思います:実行時に眠っているのはマッドプログラマーですか、それともバニーですか?
LSpice 2016年

2
バニー!バニー!それはバニーでなければなりません!(ところで、バニーを適切に実行する方法::command! Bunnies echo "Squeeeak!"; :execute "Bunnies"
アマダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.