Продолжение фиксирует привязки.Однако, как вы и предполагаете, эти привязки изменчивы.
Вы были несколько введены в заблуждение здесь лозунгом "копирует стек".Хотя это разумный способ думать о call / cc, это еще не все.Во-первых, вы действительно не хотите, чтобы языковая функция показывала, были ли локальные привязки выделены в стеке или нет.
Вместо этого call / cc определяется с использованием понятия "программные контексты".Чтобы хорошо с этим справиться, вы, возможно, захотите взглянуть на учебник Шрирама Кришнамурти (бесплатно, онлайн) PLAI или на книгу (несвободная, гораздо более углубленную) «Разработка семантики сPLT Redex ".
в сторону;ваша программа на самом деле не проверяет то, что вы хотели проверить, потому что вы никогда не вызывали захваченное продолжение.Я думаю, что вы хотели написать что-то вроде этого:
#lang racket
(define kont #f)
(let ([a 3])
(let/cc k
(set! kont k)
(set! a 4))
(printf "~s\n" a))
(kont)
... которое демонстрирует почти то же поведение, которое вы упомянули выше.