Ищу надуманный пример кода: продолжения! - PullRequest
5 голосов
/ 17 апреля 2009

Так что я думаю, что теперь я понимаю продолжения, по крайней мере, на некотором уровне, благодаря схеме сообщества wiki и Изучить схему в Fixnum Days .

Но я бы хотел больше попрактиковаться - то есть больше примеров кода, который я мог бы проработать в своей голове (желательно надуманного, чтобы не было ничего постороннего, что могло бы отвлечь от концепции).

В частности, , я хотел бы решить больше проблем с продолжениями, которые возобновляют и / или сопрограммы, а не просто использовать их для выхода из цикла или чего-то еще (что довольно просто).

В любом случае, если вы знаете о хороших уроках, помимо тех, которые я упомянул выше, или если вы хотите опубликовать то, что написали, что было бы хорошим упражнением, я был бы очень признателен!

Ответы [ 2 ]

5 голосов
/ 17 апреля 2009

Да, продолжения могут быть довольно изнурительными. Вот хорошая загадка, которую я нашел некоторое время назад - попытайтесь выяснить, что напечатано и почему:

(define (mondo-bizarro)
  (let ((k (call/cc (lambda (c) c)))) ; A
    (write 1)
    (call/cc (lambda (c) (k c))) ; B 
    (write 2)
    (call/cc (lambda (c) (k c))) ; C
    (write 3)))

(mondo-bizarro)

Объяснение того, как это работает (содержит спойлеры!):

  1. Первый call/cc store возвращает свое собственное продолжение и сохраняет его в k.
  2. Число 1 выводится на экран.
  3. Текущее продолжение, которое должно продолжаться в точке B, возвращается к k, которое возвращается к A
  4. На этот раз k теперь связано с продолжением, которое мы получили в B
  5. Число 1 снова записывается на экран
  6. Текущее продолжение, которое должно продолжаться в точке B, возвращается к k, которое является другим (но другим) продолжением в другую точку B
  7. Как только мы вернемся к исходному продолжению, важно отметить, что здесь k все еще связано с A
  8. Число 2 выводится на экран
  9. Текущее продолжение, которое должно продолжаться в точке C, возвращается к k, которое возвращается к A
  10. На этот раз k теперь связано с продолжением, которое мы получили в C
  11. Число 1 снова записывается на экран
  12. Текущее продолжение, которое должно продолжаться в точке B, возвращается к k, которое возвращается к C
  13. Число 3 выводится на экран
  14. И все готово

Следовательно, правильный вывод - 11213. Самая распространенная претензия, которую я поставил жирным шрифтом, - это важно отметить, что когда вы используете продолжения для «сброса» значения k, это не влияет на значение k обратно в исходном продолжении. Как только вы узнаете, что это становится легче понять.

4 голосов
/ 17 апреля 2009

На курсе языков программирования Университета Брауна есть проблема , установленная для продолжений общедоступная.

...