Harika bir soru.
GHCi REPL'ye yeniden girebilecek hiçbir yöntemden haberdar değilim, böylece bunu CPS işlevlerinde kullanabiliriz. Belki başkaları bir şekilde önerebilir. Bununla birlikte, bir kesmek önerebilirim. Temel olarak, bu durumda olduğu gibi IO monadına dayanıyorsa, CPS'yi tersine çevirmek için eşzamanlılıktan yararlanabilir. İşte
beygir:
data CPSControl b = CPSControl (MVar()) (MVar b)
startDebugCps :: ((a -> IO()) -> IO b) -> IO (a, CPSControl b)
startDebugCps cps = do
cpsVal <- newEmptyMVar
retVal <- newEmptyMVar
stop <- newEmptyMVar
_ <- forkIO $ do
x <- cps $ \c -> putMVar cpsVal c >> takeMVar stop
putMVar retVal x
s <- takeMVar cpsVal
return (s, CPSControl stop retVal)
stopDebugCps :: CPSControl b -> IO b
stopDebugCps (CPSControl stop retVal) = do
putMVar stop()
takeMVar retVal
testCps :: (String -> IO()) -> IO String
testCps act = do
putStrLn "testCps: begin"
act "here's some string!"
putStrLn "testCps: end"
return "some return value"
hızlı bir test:
> (x, ctrl) <- startDebugCps testCps
testCps: begin
> x
"here's some string!"
> stopDebugCps ctrl
testCps: end
"some return value"
'withSession' kesmek otomatik hale getirmek bir GHCi oturumu
küçük bir kütüphane bu kullanmak işlev tam olarak bir oturum sağlayan işlevdir. "Session" parametresini "withSession" öğesine iletilen işlevin gövdesinde işleyerek geçirirsiniz. Diğer bir deyişle, eğer main = withSession .. 'varsa, eylemi çalıştırmak için ghci komut satırında' main' (veya ': main') yazmanız yeterlidir. Şimdiye kadar "devam çizgisini çizgiye göre değerlendir", bu mantığı kendiniz uygulamak zorundasınız. – user2407038
Vay, harika soru! Gerçekten de, CPS tarzı kütüphane fonksiyonları için GHCi repl'ine yeniden girebilmek güzel olurdu. – chi