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
выбрасывается, когда пользователь входит "правда" код продолжается сmy_check = true
когда пользователь заходитложный" код продолжается сmy_check = false
и когда пользователь вводит буквенно-цифровую строку, которая не "правда" ни "ложный" go
функция выходит с 0.
Затем я попытался обернуть часть кода в блок try-catch (где есть комментарии), и компиляция не удалась:
ошибка: найдено выражение cps в позиции не cps
val my_check = попробуй
Я так понимаюпроблема с "инъекционный» исключение в продолжение, но почемуt Я просто помещаю сдвинутый вызов в блок try-catch?
Мне нужно это в рамках, которые ям планирования, при котором программист не будет знать, что его код используется в форме продолжения (онназову какую-то функцию, которую он будет считать "нормальный", но на самом деле будет делатьshift
).
Очевидно, мне нужно, чтобы он мог вызывать функцию внутри блока try-catch, даже если сам сдвинутый вызов не вызовет исключения.
Можно ли решить эту проблему с помощьюControlContext? Поможет ли я добавить "набрав» правила о значениях (может быть, с@cps [..])?
Я уже думал об альтернативе использования актеров, чтобы вы выигралине получить за это кредит :)
Спасибо,
(P.S. I 'м, используя Scala 2.9.2, и, очевидно, использовать-P: продолжения: включить флаг)