Por que existe um limite no número de argumentos da função?

7

Estou lendo :help :call, que afirma o seguinte:

Chame uma função. O nome da função e seus argumentos são os especificados com :function. Até 20 argumentos podem ser usados.

Isso me faz pensar: por que existe um limite aparentemente artificial no número de argumentos de função?

s3rvac
fonte
Este lugar não é oficial de forma alguma. Você pensou em perguntar na lista de discussão vim_dev e / ou ler a fonte?
Romainl 28/03
... sendo este último, é claro, a resposta: "Porque foi assim que foi feito": D
VanLaser
2
Também se pode argumentar que, se forem necessários mais de N argumentos, o uso de um argumento de função de lista ou dicionário seria claramente a solução alternativa (mais organizada). "20" é o limite "impor" desta solução :)
VanLaser
2
Declaro que 4 deve ser o número máximo absoluto de argumentos.
Romainl 28/03
4
"Primeiro você deve executar a Santa Função, depois contará argumentos até três, nem mais, nem menos. Três será o número que você contará, e o número da contagem será três. Quatro não contará, nem conte tu dois, exceto que depois prossiga para 3. Cinco está certo. Uma vez que o número três, sendo o terceiro número, seja alcançado, chame a tua Santa Função de Antioquia em direção ao teu inimigo, que ser impertinente aos Meus olhos, deve devolver."
muru 28/03

Respostas:

13

Porque esse é o tamanho das estruturas de dados usadas para armazenar argumentos de função. De 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))
    {
[..]
    }
}

Bem, e assim por diante.

Isso pode ser dinâmico para permitir uma quantidade arbitrária de argumentos? Certo. Mas por que?

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')

Esse é o tipo de código que faz os programadores enlouquecerem e matarem coelhos inocentes enquanto dormem.

Martin Tournoij
fonte
2
Penso que a questão importante é: são os programadores malucos, ou os coelhos, que dormem no momento da execução?
LSpice
2
Coelhinhos! Coelhinhos! Devem ser COELHOS! (Aliás, a maneira de executar corretamente coelhos: :command! Bunnies echo "Squeeeak!"; :execute "Bunnies")
Amadan