Tại sao có giới hạn về số lượng đối số hàm?


7

Tôi đang đọc :help :call, trong đó nêu rõ như sau:

Gọi một chức năng. Tên của hàm và các đối số của nó được chỉ định với :function. Lên đến 20 đối số có thể được sử dụng.

Điều này khiến tôi tự hỏi: tại sao có một giới hạn dường như giả tạo về số lượng đối số hàm?


Nơi này không chính thức bằng bất kỳ phương tiện. Bạn có cân nhắc việc hỏi về danh sách gửi thư vim_dev và / hoặc đọc nguồn không?
romainl

... dĩ nhiên, câu trả lời cuối cùng của câu trả lời: "Bởi vì đó là cách nó được tạo ra": D
VanLaser

2
Người ta cũng có thể lập luận rằng, nếu cần nhiều hơn N đối số, sử dụng đối số chức năng danh sách hoặc từ điển thay vào đó sẽ rõ ràng là giải pháp thay thế (có tổ chức hơn). "20" là giới hạn "thực thi" của giải pháp này :)
VanLaser 28/03/2016

2
Tôi xin cam đoan rằng 4 nên là số lượng đối số tối đa tuyệt đối.
romainl

4
"Trước tiên, ngươi sẽ lấy ra Chức năng Thánh, sau đó ngươi sẽ đếm các đối số thành ba, không hơn, không kém. Ba sẽ là số ngươi sẽ đếm, và số đếm sẽ là ba. Bốn người sẽ không được tính, cũng không được tính đếm hai người, ngoại trừ ngươi sau đó tiến lên ba. Năm là đúng. Một khi số ba, là số thứ ba, đạt được, thì hãy gọi chức năng Holy Antioch của ngươi đối với kẻ thù của ngươi, kẻ nghịch ngợm trong mắt ta, sẽ trả lại."
muru

Câu trả lời:


13

Bởi vì đây là kích thước của các cấu trúc dữ liệu được sử dụng để lưu trữ các đối số hàm. Từ 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))
    {
[..]
    }
}

Vâng, và như vậy.

Điều này có thể được làm cho năng động để cho phép một lượng đối số tùy ý? Chắc chắn rồi. Nhưng tại sao?

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

Đây là loại mật mã khiến các lập trình viên phát điên và giết những con thỏ vô tội trong giấc ngủ của họ.


2
Tôi nghĩ rằng câu hỏi quan trọng là: đó có phải là những lập trình viên điên rồ, hay những chú thỏ đang ngủ trong lúc hành quyết?
LSpice

2
Thỏ! Thỏ! Nó phải là BUNNIES! (BTW, cách để thực hiện đúng cách thỏ : :command! Bunnies echo "Squeeeak!"; :execute "Bunnies")
Amadan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.