5

したがって、コミュニティ スキーム wikiLearn Scheme in Fixnum Daysのおかげで、少なくともある程度は継続を理解していると思います。

しかし、私はもっと練習をしたいと思っています。つまり、頭の中で作業できるサンプルコードがもっと欲しいです (できれば工夫されているので、概念から気を散らす無関係なものはありません)。

具体的には、再開やコルーチンを使用してループなどを終了するのではなく、継続を使用してより多くの問題に取り組みたいと思います (これはかなり簡単です)。

とにかく、上でリンクしたもの以外の優れたチュートリアルを知っている場合、またはあなたが書いたものを投稿して良い演習になる場合は、非常に感謝しています!

4

2 に答える 2

5

ええ、継続はかなり気が遠くなる可能性があります。これは私がしばらく前に見つけた良いパズルです - 何が印刷されているのか、なぜ印刷されているのかを理解してみてください:

(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ストアはそれ自身の継続を返し、それを に格納しkます。
  2. 番号1が画面に書き込まれます。
  3. 点 B で継続する現在の継続は k に戻され、k は A に戻ります。
  4. 今度は、k は B で取得した継続にバインドされます。
  5. 番号1が画面に再度書き込まれます
  6. 点 B で継続する現在の継続は、別の点 B への別の (ただし異なる) 継続である k に戻されます。
  7. 元の継続に戻ったら、ここで k がまだ A にバインドされていることに注意することが重要です。
  8. 番号2が画面に書き込まれます
  9. 点 C で継続する現在の継続は、k に戻され、k は A に戻ります。
  10. 今度は、k は C で取得した継続にバインドされます。
  11. 番号1が画面に再度書き込まれます
  12. 点 B で継続する現在の継続は k に戻され、k は C に戻ります。
  13. 番号3が画面に書き込まれます
  14. そして、あなたは終わった

したがって、正しい出力は11213です。私が太字で示した最も一般的な問題点 - 継続を使用して k の値を「リセット」する場合、元の継続の k の値に影響を与えないことに注意することが重要です。それがわかると、より理解しやすくなります。

于 2009-04-16T21:20:00.767 に答える
4

ブラウン大学のプログラミング言語コースには、公開されている継続問題セットがあります。

于 2009-04-16T21:30:35.140 に答える