параметры, которые могут быть переданы функции в SBCL
Вы не проходите параметр s. Вы передаете аргументы.
(defun foo (x y) (list x y))
x
и y
являются параметры функции foo
.
(foo 20 22)
20
и 22
являются аргументы в вызове функции foo
.
См. Переменные call-arguments-limit
и lambda-parameters-limit
.
SBCL и колл-аргументы предела
Если функция не может обрабатывать почти заявленное количество аргументов, то это выглядит как ошибка в SBCL
. Возможно, вы захотите сообщить об этой ошибке. Возможно, им нужно изменить значение call-arguments-limit
.
Тестирование
APPLY
это один из способов, чтобы проверить его.
Другой:
(eval (append '(drop-params)
(loop for i from 1 to 2533911 collect 1)))
Можно также использовать FUNCALL с числом аргументов рассредоточены.
Почему существует ограничение?
Стандарт Common Lisp был написан для обеспечения эффективной реализации на разных компьютерах.Считалось, что некоторые реализационные вызовы функций машинного уровня поддерживают только ограниченное количество аргументов. В стандарте указано, что число поддерживаемых аргументов может быть как 50
. На самом деле некоторые реализации имеют относительно низкое количество поддерживаемых аргументов.
Таким образом, apply
в Common Lisp не является инструментом для обработки списка, но для вызова функций с вычисленными аргументами.
Для списка и использования обработки вектора УМЕНЬШИТЬ вместо СОХРАНИТЬ
Если мы хотим суммировать все числа в списке, замените
(apply #'+ list) ; don't use this
с
(reduce #'+ list) ; can handle arbitrary long lists
Рекурсия
применять не является оптимизированным рекурсивной функцией
Я не могу понять, почему функцию APPLY
следует использовать рекурсию.
Например, если вы думаете о
(apply #'+ '(1 2 3 4 5))
Повторное суммирование аргументов выполняется с помощью функции +
и не apply
.
Это отличается от
(reduce #'+ '(1 2 3 4 5))
где повторный вызов функции +
с двумя аргументами выполняется reduce
.
Уточнение: я действительно ищу возможные причины внедрения, почему это вызывает ошибку, вызванную стеком. Что находится в стеке и почему? На самом деле меня не интересуют лучшие способы выполнения обработки списка. – KernelPanic
какой рекурсии вы ожидаете в APPLY? Я бы этого не ожидал. –
Я тоже не ожидал, поэтому я смутился. См. Мой ответ ниже для того, что на самом деле заканчивается в стеке, что в ретроспективе очень очевидно. Я просто привык думать «переполнение стека == неправильная рекурсия», я думаю, – KernelPanic