Получение переполнения стека с помощью GNU CLisp (Windows) - PullRequest
2 голосов
/ 25 октября 2009

Я получаю сообщение "RESET переполнения стека программ" во время работы моей программы. Поэтому я установил добавленный счетчик, чтобы увидеть, сколько раз я рекурсивно вызываю основную функцию в моей программе. Оказывается, это примерно 30 000 раз, и данные, которые я собираю, представляют собой списки длиной около 10 элементов, которые, я думаю, не так много. У меня вопрос, является ли это количество рекурсивных вызовов и использования памяти распространенным или нет, или более вероятно, что я делаю что-то не так? Я проверил диспетчер ресурсов Vista и обнаружил, что объем памяти увеличился примерно на 1 МБ для процесса lisp.exe. И как мне настроить ограничение переполнения стека CLisp?

Ответы [ 2 ]

2 голосов
/ 26 октября 2009

http://clisp.cons.org/impnotes.html#faq-stack

Обратите внимание, что если вы выполняете хвостовые вызовы и компилируете свои функции, ограничений не будет вообще.

1 голос
/ 25 октября 2009

1 МБ - это размер стека по умолчанию в Windows. Я не знаю, возможно ли изменить его без перезапуска программы, но в любом случае я бы рекомендовал либо преобразовать программу в хвостово-рекурсивную форму и использовать байтовый компилятор CLisp, который оптимизирует ее, либо просто преобразовать в итерационная форма. Хотя многие компиляторы Common Lisp реализуют оптимизацию хвостовых вызовов, стандарт не требует этого, поэтому неограниченная рекурсия не должна использоваться.

...