Так что, похоже, ваша версия invert на самом деле возвращает список другой топологии. Если вы выполните (invert ...)
для '((1 2) (3 4))
, вы получите обратно '((2 . 1) (4 . 3))
, который является списком выражений, а не списков.
Я написал версию инвертирования, которая поддерживает топологию списка, но она не является хвостовой рекурсией, поэтому в итоге она будет поддерживать стек вызовов во время его повторения.
(define (invert lst)
(if (null? lst)
lst
(cons (list (cadar lst) (caar lst))
(invert (cdr lst)))))
Если вы хотите версию, которая имитирует ваше поведение инвертирования, замените list
на cons
в секундах до последней строки.