Так как это домашняя работа, я расскажу вам процесс, который я использовал, чтобы найти ошибку. Дайте мне знать, если вы все еще застряли.
Честно говоря, это слишком много кода для * глубокого анализа в вопросе переполнения стека. Поэтому я должен использовать подсказки из вывода. В частности, у вас есть список с пустотой в нем. И это в конце, в неправильном списке. Это означает две вещи:
- У вас есть функция, которая не возвращает значение. Это вызвано двумя причинами: (1) написание
if
только с одной веткой - ветвь else
вернет void - или (2) завершением вашей функции display
, которая возвращает void.
- Последнее, что вы сделали, было
cons
. Возможно, вы хотели сохранить или, возможно, хотели использовать '() вместо того, чтобы правильно завершить список.
Итак: первый шаг - поиск кода для всех случаев использования cons
. Ваши селекторы выглядят хорошо. Это оставляет две ветви в heap-merge
и cons
в heapsort
. Все три вызова cons
используют функции для получения cdr
.
Итак: следующий шаг - посмотреть на heap-get-subheaps
и aux
, чтобы увидеть, есть ли у одного из путей кода, который не возвращает значение. Возможно, у вас есть некоторые отладочные сообщения, оставленные по ошибке. Или, может быть, у вас есть if
, который имеет только истинную ветвь, и вы забыли ложную ветвь.
* Примечание. Большинство схем имеют так мало функций отладки, что эвристика в любом случае является вашим лучшим выбором. Это приобретенный навык.