Я предлагаю начать с вопроса: что значит быть первоклассным продолжением?
Продолжение выражения по существу состоит из двух частей данных: во-первых, замыкание (то есть окружение) этого выражения; и во-вторых, представление того, что должно быть сделано с результатом выражения. Таким образом, язык с первоклассными продолжениями - это язык, в котором есть структуры данных, инкапсулирующие эти части, и который обрабатывает эти структуры данных так же, как и любой другой.
call / cc - это особенно элегантный способ реализовать эту идею: текущее продолжение упаковано как процедура, которая инкапсулирует то, что должно быть сделано с выражением, как то, что процедура делает при применении к выражение; представлять продолжение таким способом просто означает, что закрытие этой процедуры содержит среду на месте, где она была вызвана.
Вы могли бы представить себе реализацию идеи первоклассных продолжений другими способами. Они не будут называться call / cc, и мне сложно представить, как такое представление может быть проще.
В прощальном замечании рассмотрим реализацию let / cc, которую упоминал Eli, которую я предпочитаю называть bind / cc:
(define-syntax bind/cc
(syntax-rules ()
((bind/cc var . body)
(call/cc (lambda (var) . body)))))
И в качестве упражнения, как бы вы реализовали call / cc на основе bind / cc?