Это частично дублирует ответ Криса Джестера-Янга, но я надеюсь, что смогу объяснить его лучше: -).
В CPS разница, которую вы ищете, заключается между этими двумя вещами (примерно):
- Вы можете вызвать процедуру и передать ей продолжение, которое вы прошли. Это эквивалентно оптимизированному хвостовому вызову прямого стиля.
- Или вы можете вызвать процедуру и передать в качестве ее продолжения новую процедуру, которая что-то делает с «возвращаемым значением», передавая исходное продолжение. Это эквивалент стекового вызова прямого стиля.
Последнее - то, что делают лямбды в примере Криса. По сути, оценка лямбды создает замыкание - и эти замыкания используются для выполнения той же работы, что и кадры стека при выполнении программы прямого стиля. Вместо адреса возврата в кадре стека замыкание содержит привязку для функции продолжения, и код для замыкания вызывает это.