Как работает этот пример callcc? - PullRequest
0 голосов
/ 13 мая 2010

(callcc (fun k -> k 7)) + 3<br> (callcc (fun k -> 7)) + 3

Что каждый из них оценивает и почему?

1 Ответ

2 голосов
/ 13 мая 2010

Полагаю, это домашнее задание. Если это не так, просто скажите, и я скажу вам ответ напрямую.

Способ call/cc работает для захвата продолжения в точке, которую он называет. Для этих примеров это означает, что когда вы видите call/cc, замените весь вызов черным ящиком и посмотрите, что осталось:

(call/cc (fun k -> k 7)) + 3
=>
************************ + 3

Итак, + 3 - это то, что происходит с результатом вызова call/cc. Это «что будет дальше» - это то, что call/cc упаковывает и вызывает k*.

Все, что вам нужно сейчас, это выяснить, что происходит с вами, позвоните k со значением 7.

Во втором примере вы вообще не звоните k. Поскольку с k вы не делаете ничего особенного, не стоит ожидать, что call/cc сделает что-то особенное.


Примечание: код, который вы даете, выглядит как некий ML. Ни один из известных мне диалектов ML не имеет call/cc, поэтому, если и у вашего диалекта нет, попробуйте загрузить PLT Scheme , чтобы поиграть с ним в интерактивном режиме. Синтаксис не слишком сложен для понимания.

* «продолжение» - немного более приятный способ сказать «что будет дальше», хотя и не намного приятнее.

...