Warum ist die Anzahl der Funktionsargumente begrenzt?

7

Ich lese :help :call, in dem Folgendes steht:

Rufen Sie eine Funktion auf. Der Name der Funktion und ihre Argumente entsprechen den Angaben mit :function. Es können bis zu 20 Argumente verwendet werden.

Ich frage mich daher, warum die Anzahl der Funktionsargumente scheinbar künstlich begrenzt ist.

s3rvac
quelle
Dieser Ort ist keineswegs offiziell. Haben Sie darüber nachgedacht, auf der Mailingliste vim_dev nachzufragen und / oder die Quelle zu lesen?
Romainl
... letzteres ist natürlich die Antwort: "Weil es so gemacht wurde": D
VanLaser
2
Man kann auch argumentieren, dass, wenn mehr als N Argumente benötigt werden, die Verwendung eines Listen- oder Wörterbuchfunktionsarguments eindeutig die alternative (besser organisierte) Lösung wäre. "20" ist das "Durchsetzungs"
-Limit
2
Ich erkläre hiermit, dass 4 die absolute maximale Anzahl von Argumenten sein sollte.
Romainl
4
"Zuerst sollst du die Heilige Funktion herausnehmen, dann sollst du die Argumente bis drei zählen, nicht mehr und nicht weniger. Drei soll die Zahl sein, die du zählen sollst, und die Zahl der Zählung soll drei sein. Vier sollst du auch nicht zählen." Zähle zwei, außer dass du dann zu drei übergehst. Fünf ist richtig. Sobald die Nummer drei, die dritte Nummer, erreicht ist, rufst du deine heilige Funktion von Antiochia gegenüber deinem Feind, der in meinen Augen ungezogen ist Gib es zurück."
Muru

Antworten:

13

Weil dies die Größe der Datenstrukturen ist, die zum Speichern von Funktionsargumenten verwendet werden. Von 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))
    {
[..]
    }
}

Nun und so weiter.

Könnte dies dynamisch gestaltet werden, um eine beliebige Anzahl von Argumenten zuzulassen? Sicher. Aber warum?

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

Dies ist die Art von Code, die Programmierer verrückt macht und unschuldige Hasen im Schlaf ermordet.

Martin Tournoij
quelle
2
Ich denke, die wichtige Frage ist: Sind es die verrückten Programmierer oder die Hasen, die zum Zeitpunkt der Ausführung im Schlaf sind?
LSpice
2
Hasen! Hasen! Es müssen HÄSCHEN sein! (Übrigens, der Weg, um Hasen richtig auszuführen : :command! Bunnies echo "Squeeeak!"; :execute "Bunnies")
Amadan