Scala Continuations - Dlaczego moje przesunięte połączenie nie może znajdować się w bloku try-catch?

Jestem nowy w kontynuacjach Scali i stosunkowo nowy w języku scala w ogóle.

Próbowałem grać z kontynuacjami Scali i napisałem następujący kod:

case class MyException(msg:String) extends Exception

def go:Int = reset {
  println("enter your input")
  val my_check = //try 
  {
    val user_input = readLine()
    if (!user_input.matches("\\w+")) {
      throw new MyException("illegal string: " + user_input) 
    }
    shift {
      k: (Boolean => Int) => {
        if (user_input == "true") {
          k(true)
        }
        else if (user_input == "false") {
          k(false)
        }
        else {
          // don't even continue
          0
        }
      }
    }
  } 
//  catch {
//    case MyException(msg) => false
//  }
  if (my_check) {
    println("TRUE")
    1
  }
  else {
    println("FALSE")
    -1
  }
}

println(go)

Kod działał zgodnie z oczekiwaniami: gdy użytkownik wprowadzi ciąg niealfanumeryczny aMyException jest wyrzucane, gdy użytkownik wprowadzi „true” kod będzie kontynuowanymy_check = true, gdy użytkownik wprowadzi „false”, kod będzie kontynuowanymy_check = false, a gdy użytkownik wprowadzi ciąg alfanumeryczny, który nie jest „prawdziwy” ani „fałszywy”go funkcja kończy działanie z 0.

Następnie próbowałem zawinąć część kodu w bloku try-catch (gdzie są komentarze), a kompilacja nie powiodła się:

błąd: znaleziono wyrażenie cps w pozycji innej niż cps

val my_check = spróbuj

Rozumiem, że istnieje problem z „wstrzykiwaniem” wyjątku w kontynuację, ale dlaczego nie mogę po prostu umieścić przesuniętego wywołania w bloku try-catch?

Potrzebuję tego w ramach, które planuję, w których programista nie będzie wiedział, że jego kod jest używany w formie kontynuacji (będzie nazywał jakąś funkcję, którą uznałby za „normalną”, ale faktycznie wykonashift).

Oczywiście potrzebuję go, aby mógł wywołać funkcję wewnątrz bloku try-catch, nawet jeśli samo przesunięte połączenie nie spowoduje wyjątku.

Czy można rozwiązać ten problem za pomocąControlContext? Czy to pomoże, jeśli dodam zasady „pisania” do wartości (być może z@cps [..])?

Zastanawiałem się już nad alternatywą używania aktorów, więc nie otrzymasz za to żadnego uznania :)

Dzięki,

(P.S. Używam Scala 2.9.2 i oczywiście używam-P: kontynuacje: włącz flaga)

questionAnswers(1)

yourAnswerToTheQuestion