Кіріспе
Функционалдық бағдарламалаудағы басқару ағыны операторы Scheme компьютерлік бағдарламалау тілінде ағымдағы жалғастырумен процедуралық шақыру, қысқартылып call/cc деп белгіленеді, басқару ағыны операторы ретінде қолданылады. Оны бірнеше басқа бағдарламалау тілдері де қабылдады. Бір ғана аргумент ретінде f функциясын қабылдап, (call/cc f) өрнекте ағымдағы жалғастыруға қолданылады. Мысалы, ((call/cc f) e2) f функциясын өрнектің ағымдағы жалғастыруына қолданумен тең. Ағымдағы жалғастыру (call/cc f) ламбда абстракциясымен байланысты c айнымалысымен алмастырылып беріледі, сондықтан ағымдағы жалғастыру (lambda (c) (c e2)) болады. Оған f функциясын қолдану соңғы нәтижені береді: (f (lambda (c) (c e2))). Мысалы, (e1 (call/cc f)) өрнегінде (call/cc f) қосалқы өрнегінің жалғастыруы (lambda (c) (e1 c)) болады, сондықтан бүкіл өрнек (f (lambda (c) (e1 c))) тең. Басқаша айтқанда, ол бағдарламаның ағымдағы басқару контекстін немесе басқару күйін объект ретінде "көрінеу етеді" және оған f функциясын қолданады. Жалғастыру объектісі – бірінші сыныптық мән, функция ретінде ұсытылады, оның жалғыз операциясы функцияны қолдану болып табылады. Жалғастыру объектісі аргументке қолданылғанда, қолданыстағы жалғастыру жойылады және қолданылған жалғастыру оның орнына қалпына келтіріледі, бағдарлама ағыны жалғастыруды түсірген нүктеде жалғасады, ал жалғастыру аргументі call/cc шақыруының "қайтару мәніне" айналады. Call/cc арқылы жасалған жалғастырулар бірнеше рет шақырылуы мүмкін, тіпті call/cc қолданбасының динамикалық ауқытынан тыс жерде де. Компьютер ғылымында осы типтегі имплицитті бағдарламалық күйді объект ретінде көрінеу ету реефикация деп аталады. (Scheme жалғастыруларды немесе функцияларды қолдануды синтаксистік тұрғыдан ажыратпайды.) Call/cc көмегімен басқа тілдерден бірнеше код жолдары арқылы күрделі басқару операторларын іске асыруға болады, мысалы, Маккартидің амб операторы (нондетерминистік таңдау), Prolog стиліндегі кері ізілдіру, Simula 67 стиліндегі корутиналар және олардың жалпылама түрлері, Icon стиліндегі генераторлар, немесе процессорлар мен жіптер, тіпті сирек кездесетін COMEFROM.
In the Scheme computer programming language, the procedure call with current continuation, abbreviated call/cc, is used as a control flow operator. It has been adopted by several other programming languages. Taking a function f as its only argument, (call/cc f) within an expression is applied to the current continuation of the expression. For example ((call/cc f) e2) is equivalent to applying f to the current continuation of the expression. The current continuation is given by replacing (call/cc f) by a variable c bound by a lambda abstraction, so the current continuation is (lambda (c) (c e2)). Applying the function f to it gives the final result (f (lambda (c) (c e2))). As a complementary example, in an expression (e1 (call/cc f)), the continuation for the sub expression (call/cc f) is (lambda (c) (e1 c)), so the whole expression is equivalent to (f (lambda (c) (e1 c))). In other words it takes a "snapshot" of the current control context or control state of the program as an object and applies f to it. The continuation object is a first class value and is represented as a function, with function application as its only operation. When a continuation object is applied to an argument, the existing continuation is eliminated and the applied continuation is restored in its place, so that the program flow will continue at the point at which the continuation was captured and the argument of the continuation then becomes the "return value" of the call/cc invocation. Continuations created with call/cc may be called more than once, and even from outside the dynamic extent of the call/cc application. In computer science, making this type of implicit program state visible as an object is termed reification. (Scheme does not syntactically distinguish between applying continuations or functions.) With call/cc a variety of complex control operators can be implemented from other languages via a few lines of code, e. g., McCarthy's amb operator for nondeterministic choice, Prolog style backtracking, Simula 67 style coroutines and generalizations thereof, Icon style generators, or engines and threads or even the obscure COMEFROM.
Сын
Олег Киселев, OCaml үшін шектелген жалғастыру іске асыруын жасаған автор және басқару операторларын іске асыру үшін шектелген стек манипуляциялауға арналған қолданбалы бағдарламалау интерфейсін (API) жобалаған адам, call/cc манипуляциялайтын толық стек жалғастыруларының орнына шектелген жалғастыруларды пайдалануды жақтады: "call/cc-ді барлық басқа басқару құралдары іске асырылуы тиіс негізгі басқару мүмкіндігі ретінде ұсыну – жаман идея болып шықты. Өнімділік, жад және ресурстардың жоғалуы, іске асырудың, пайдаланудың және түсінудің қарапайымдығы – барлығы call/cc-ге қарсы дәлелдеме."
Құрылыссыз логикаға қатынасы
Кури-Ховард дәлелдемелер мен бағдарламалар арасындағы сәйкестік call/cc-ті Пирс заңымен байланыстырады, ол интуиционисттік логиканы конструктивті емес, классикалық логикаға дейін кеңейтеді: ((α → β) → α) → α. Мұнда, ((α → β) → α) – f функциясының типі, ол α типіндегі мәнді тікелей қайтара алады немесе (α → β) типінің жалғасына аргумент қолданады. Жалғастыру қолданылған кезде қолданыстағы контекст жойылғандықтан, β типі ешқашан қолданылмайды және бос тип ⊥ деп қабылдануы мүмкін. Екі есе жою принципі ((α → ⊥) → ⊥) → α, аргументі f әрқашан ағымдағы жалғастыруды бағалайтынын күтетін call/cc нұсқасымен салыстыруға болады, бірақ әдетте мәнді қайтармайды. Классикалық логиканың интуиционисттік логикаға енгізілуі жалғастыруды беру стиліндегі аудармамен байланысты.