Механизм функции в схеме - PullRequest
2 голосов
/ 27 июня 2010

Вот странная функция на схеме:

(определить f (call / cc (lambda (x) x))))

(((f 'f) f) 1)

Когда в командной строке вызывается f, отображается результат f.Чем объясняется этот механизм? ..

Спасибо!

1 Ответ

3 голосов
/ 27 июня 2010

Вы только что наткнулись на «продолжения», возможно, самую сложную для понимания в Схеме.

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

...