0

さて、私はこれをあきらめる準備ができています。

継続(シフトを使用して実行)の状態を保存したいと思います。ただし、注意点として、リセット後のコードは実行しないでください。継続がワーカースレッドによって実行されていることを考慮してください。これ以上処理されるべきではありません。継続は、再開できる継続のグローバルリストに保存され、それ以降のすべては無視され、実行されるべきではありません。

ワーカースレッドは存続する必要があります(中止したり、新しいスレッドのスピンアップを必要として破棄したりすることはできません)。

reset {
  shift {
    (cont:Unit=>Unit) =>
      println(1)
      suspend() // how would I implement something like this?
      cont()
  }

  println(3)
}

println(2)

降伏する必要があります

1

継続を再開すると、

3
2

継続はリセットの範囲に限定されているため、現時点ではこれはまったく不可能と思われます。しかし、私はStackOverflowに1つのクラックを与えると考えました。


編集:基本的に...(おそらくこれを先に置くべきでした)メソッドを呼び出し、結果を出す準備ができるまで実行を一時停止し、スレッドの同期ではなく、イベントループを介してこれを実現したいと思います。

4

1 に答える 1

1

これがあなたの状況に当てはまるかどうかはわかりませんが、複数のリセットを組み合わせる方法の例を次に示します。

  type Proc = Unit => Unit

  val resume = reset {
    shift { k1: Proc =>
      reset {
        shift { k2: Proc =>
          println(1)
          () => k2(); k1() 
        }        
        println(3)
      }
    }
    println(2)
  }
  // 1

  resume()
  // 3
  // 2

更新:これをメソッドで使用する方法は次のとおりです。

  def f(): Unit @cpsParam[Unit, () => Unit] = {
    println(0)

    shift { k1: Proc =>
      reset {
        shift { k2: Proc =>
          println(1)
          () => k2(); k1()
        }        
        println(2)
      }
    }

    println(3)
  }

  val continue = reset {
    println(-1)
    f()
    println(4)
  }

  println("...")

  continue()

プリント:

-1
0
1
...
2
3
4

fを呼び出した後、リセットが終了するまですべてを一時停止したくない場合は、次のようにします。

  reset {
    println(-1)
    shift { k: Proc =>
      reset{f()}()
      k()
    }
    println(4)
  }

  println("...")

プリント:

-1
0
1
2
3
4
...
于 2012-12-16T19:22:16.153 に答える