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 флаг)