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