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)