Scala Continuations - Почему мой сдвинутый вызов не может быть внутри блока try-catch?

Я новичок в продолжениях Scala и относительно новичок в языке Scala в целом.

Я попытался поиграть с продолжениями Scala и написал следующий код:

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)

Код работал должным образом: когда пользователь вводит не буквенно-цифровую строкуMyException выбрасывается, когда пользователь вводит «true» код продолжается сmy_check = trueкогда пользователь вводит «ложь» код продолжается сmy_check = falseи когда пользователь вводит буквенно-цифровую строку, которая не является «истинной»; ни "ложь"go функция выходит с 0.

Затем я попытался обернуть часть кода в блок try-catch (где есть комментарии), и компиляция не удалась:

error: found cps expression in non-cps position

val my_check = try

Я понимаю, что существует проблема с "инъекцией" исключение в продолжение, но почему я не могу просто поместить сдвинутый вызов в блок try-catch?

Мне это нужно в рамках планирования, в котором программист не будет знать, что его код используется в форме продолжения (он назовет некоторую функцию, которая, по его мнению, будет «нормальной»), но на самом деле сделаетshift).

Очевидно, мне нужно, чтобы он мог вызывать функцию внутри блока try-catch, даже если сам сдвинутый вызов не вызовет исключения.

Можно ли решить эту проблему с помощьюControlContext? Will it help if I add some "typing" rules on the values (maybe with the @cps[..])?

Я уже думал об альтернативе использования актеров, чтобы вы не получили за это никакой оценки :)

Спасибо,

(P.S. я использую Scala 2.9.2 и, очевидно, использую-P:continuations:enable флаг)

Ответы на вопрос(1)

Ваш ответ на вопрос