Вы только что наткнулись на «продолжения», возможно, самую сложную для понимания в Схеме.
call/cc
- это сокращение от call-with-current-continuation
, процедура выполняет только одну функцию аргументав качестве собственного аргумента и называет его текущим «продолжением».
Так что же такое продолжение?Это позорно сложно объяснить, и вам, вероятно, стоит поискать его в Google, чтобы получить лучшее объяснение, чем у меня.Но продолжение - это просто функция одного аргумента, тело которого представляет определенное «продолжение» значения.
Например, когда у нас есть (+ 2 (* 2 exp))
, где exp - случайное выражение, если мы оцениваем это выражение тамявляется «продолжением», ожидающим этого результата, местом, где продолжается оценка, если, например, оно оценивается как 3, оно вставляет это значение в выражение (* 2 3)
и далее оттуда со следующим «продолжением», или местом, гдеоценка продолжается, что составляет (+ 2 ...)
.
Практически во всех контекстах языков программирования место, где вычисление продолжается со значением, совпадает с тем, с которого оно началось, хотя во многих языках оператор return
ключевой контрпример, продолжение находится в совершенно ином месте, чем само выражение return.
В Схеме вы имеете прямой контроль над своими продолжениями, вы можете «захватить» их, как это было сделано там.То, что делает f
, является ничем иным, как вычислением текущего продолжения, в конце концов, когда (lambda (x) x)
вызывается с текущим продолжением, оно просто оценивает его, как и все тело функции.Как я уже сказал, продолжения - это сами функции, чье тело можно рассматривать как продолжение, которое они должны захватить, что было классно показано разработчиками Схемы, что продолжения - это просто лямбда-абстракции.
Так в кодеf сначала вычисляет продолжение, в которое оно было вызвано. Затем это продолжение как функция применяется к 'f
(символ).Это означает, что этот символ возвращается к этому продолжению, где он снова оценивается как символ, чтобы выявить функцию, с которой он связан, который снова вызывается с символом в качестве аргумента, который в итоге отображается.
Поразительно, если вы видели фильм «Учебник для начинающих», возможно, это объясняет это:
http://thisdomainisirrelevant.net/1047