You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I have started with a n mtl stack type Forth w a r = ExceptT VMSignal (StateT (VM w a) IO) r and want to use haskeline to provide command line editing to my repl. I've refactored to use type Forth w a r = CME.ExceptT VMSignal (StateT (VM w a) (InputT IO)) r.
And functions which previously ran the stack now have calls like
repl:: (ForthTypea, Eqa) =>VMwa->ForthStepwa->IO()
repl vm initF =do
catchSigint vm
let behaviour =maybe defaultBehavior useFileHandle (inputPort vm)
(r, vm') <- runInputTBehavior behaviour
defaultSettings
(runStateT (runExceptT initF) vm)
:
and
fwRefill::ForthStepwa
fwRefill =do
vm <- getVm
case inputPort vm ofNothing-> throwError VMNoInputJust h ->do-- eof <- liftIO (hIsEOF h)-- when eof (CME.throwError VMEOF)
trace 2"REFILL"
line <- runInputTBehavior (useFileHandle h) defaultSettings
$ getInputLine "> "maybe (throwError VMEOF) (\b -> put (vm { buffer = b })) line
next
The program works as before (and the > prompt appears. but I can't scroll back into history and the arrow keys still don't work (you get > ^[[A on pushing the up arrow, for example (as before). I don't want to put the InputT on the outside as I'd then have to sprinkle all my code with lifts, which I'd prefer to avoid.
What can I do to get command line editing to function, please?
The text was updated successfully, but these errors were encountered:
The isue you're having is that you're creating/destroying an InputT context every time you read user input. Ideally you'd only call runInputTonce, in your main function. (I believe could still keep InputT at the bottom of your stack as InputT IO as you have now.)
main :: IO ()
main = runInputT defaultSettings (evalStateT loop 0)
loop :: StateT Int (InputT IO) ()
loop = do
n <- get
minput <- lift $ getInputLine (show n ++ ":")
case minput of
Nothing -> return ()
Just "quit" -> return ()
Just "q" -> return ()
Just s -> do
lift $ outputStrLn ("line " ++ show n ++ ":" ++ s)
modify (+1)
loop
I have started with a n mtl stack
type Forth w a r = ExceptT VMSignal (StateT (VM w a) IO) r
and want to usehaskeline
to provide command line editing to my repl. I've refactored to usetype Forth w a r = CME.ExceptT VMSignal (StateT (VM w a) (InputT IO)) r
.And functions which previously ran the stack now have calls like
and
The program works as before (and the > prompt appears. but I can't scroll back into history and the arrow keys still don't work (you get
> ^[[A
on pushing the up arrow, for example (as before). I don't want to put the InputT on the outside as I'd then have to sprinkle all my code with lifts, which I'd prefer to avoid.What can I do to get command line editing to function, please?
The text was updated successfully, but these errors were encountered: