Как использовать continuations?

Continuations в Ruby позволяют создать объект, представляющий собой место в программе на Ruby, и затем вернуться к этому месту в любой момент (даже если это место находится уже вне области видимости.) Continuations можно использовать для реализации сложных управляющих структур, но обычно полезны в качестве способа для запутывания людей. В письме ruby-talk:4482 Джим Вайрих (Jim Weirich) привел следующие примеры continuations:

  # ------------------------------------------------
  # Simple Producer/Consumer
  # ------------------------------------------------
  # Connect a simple counting task and a printing task
  # together using continuations.
  #
  # Usage:  count(limit)

  def count_task(count, consumer)
    (1..count).each do
      |i|
      callcc {|cc| consumer.call cc, i }
    end
    nil
  end

  def print_task()
    producer, i = callcc { |cc| return cc }
    print "#{i} "
    callcc { |cc| producer.call }
  end

  def count(limit)
    count_task(limit, print_task())
    print "
"
  end

и

  # ------------------------------------------------
  # Filtering Out Multiples of a Given Number
  # ------------------------------------------------
  # Create a filter that is both a consumer and producer.
  # Insert it between the counting task and the printing task.
  #
  # Usage:  omit (2, limit)

  def filter_task(factor, consumer)
    producer, i = callcc { |cc| return cc }
    if (i%factor) != 0 then
      callcc { |cc| consumer.call cc, i }
    end
    producer.call
  end

  def omit(factor, limit)
    printer = print_task()
    filter = filter_task(factor, printer)
    count_task(limit, filter)
    print "
"
  end

и

  # ------------------------------------------------
  # Prime Number Generator
  # ------------------------------------------------
  # Create a prime number generator. When a new prime
  # number is discovered, dynamically add a new multiple
  # filter to the chain of producers and consumers.
  #
  # Usage:  primes (limit)

  def prime_task(consumer)
    producer, i = callcc { |cc| return cc }
    if i >= 2 then
      callcc { |cc| consumer.call cc, i }
      consumer = filter_task(i, consumer)
    end
    producer.call
  end

  def primes(limit)
    printer = print_task()
    primes = prime_task(printer)
    count_task(limit, primes)
    print "
"
  end