В выражении #0={1 2 3 . #0#}
представьте #0=
как привязку и #0#
как ссылку на эту привязку - то есть в списке первые три элемента 1 2 3
, а четвертый элемент - указательк началу списка, следовательно, формируя круговой список из трех элементов.Если вы продолжите продвигаться по этому списку (последовательно mcdr
с), вы увидите список из трех элементов в циклическом шаблоне 1 2 3 1 2 3 ...
, всегда показывающий, что четвертый элемент возвращается к первому.
Изучение вышеуказанной функции дает понять, почему это происходит.Процедура pro
просто вызывает inner
для параметра lst
(правильный список, список с null
в качестве последнего элемента), а затем возвращает измененный lst
, интересная часть - это то, что происходит в inner
:
(if (null? (mcdr l))
: если мы находимся на последнем ненулевом элементе списка, замените следующий элемент (который должен быть null
в надлежащем списке) нассылка на первый элемент, который, как мы знаем, находится в параметре lst
: (set-mcdr! l lst)
- В противном случае продолжайте продвигаться по списку:
(inner (mcdr l))
Подводя итог:pro
Процедура получает в качестве входных данных правильный список и возвращает тот же список, но последний элемент указывает на его первый элемент - круговой список.