haskellwindows-7leksah

Using Leksah debugger with programs that use readLn and similar


I recently installed Leksah (0.10.0.4 on Windows 7 64 bit), which seems like an interesting IDE for Haskell. However, I am clearly overlooking something when it comes to user input to programs when using it.

I have a very simple

do
    printStr "Prompt: "
    x <- readLn

block in my code. When the debugger hits the readLn, I would expect to be able to provide input somewhere. However, I can't find any input window. I expected at first that the log window might be enabled, but I can't find anywhere to interact with the program. Running in GHCi everything is as expected, so I'm certain it isn't the code.

Further, when I just do a "Package->Run", the prompt doesn't become visible until some other log output arrives (such as doing a rebuild).

Having used Emacs with Haskell mode in the past on Linux, I was hoping for a more user friendly experience so I could engage some Windows programmers on Haskell topics. Am I missing something?


Solution

  • From this thread http://groups.google.com/group/leksah/browse_thread/thread/7d3e3bf64e56f190/30278795c23b2168

    This is a known issue we have not addressed yet. We send GCHi commands to its stdin, but we have no good way for sending user input there too.

    I am not sure how we should fix this. We can't send user input to the process that is being debugged using our command channel (our code waits for the prompt from ghci before sending commands).

    If we set up some way to send data to stdin without waiting it may interfere with the GHCi commands we send (because it is still all going down the same pipe).

    We need to find out if there is some way we can have separate stdin/stdout/stderr pipes for GHCi itself and the program GHCi is debugging.

    In the mean time you could have you app open a socket or named pipe and write input to that from another terminal. Something like this (not tested)...

    main = do 
        sock <- listenOn (PortNumber 8000) 
        -- Start a new terminal window (this command needs to be changed for OS X or Windows) 
        forkIO $ system "gnome-terminal -e \"telnet localhost 8000\"" 
        (handle, _, _) <- accept sock -- Wait for the new terminal to connect 
        -- You might want to add a call to hSetBuffering here 
        line <- hGetLine handle 
        print line 
        sClose sock
    

    (You will need to add process and network to your package dependancies. Then Ctrl+R should add the import statements needed.)

    This will allow interaction, but keep stdin clear for leksah to talk to ghci. Ideally you would keep stdout and stderr clear too and write to this socket instead, but Leksah should cope fairly well with arbitrary output.