[Haskell-cafe] Intercept stdin in Haskell

Rogan Creswick creswick at gmail.com
Sun Jan 5 20:09:32 UTC 2014


On Sun, Jan 5, 2014 at 12:03 PM, Andrew Gibiansky <
andrew.gibiansky at gmail.com> wrote:

> I am using the GHC API extensively. The entire application is built on the
> GHC API, with the occasional bit of code practically stolen from GHCi :)
>
> However, I don't know of a way to intercept stdin even if I am using the
> GHC API. Given a block of code, there is no sane static analysis than can
> be done to detect whether it reads from stdin, as far as I know.
>

Could you rebind stdin to the ipython input channel every time a cell from
the ipython interface is evaluated? (and then reset it, if necessary, after
the cell finishes and in related exception handlers, of course).

--Rogan


>
> Is there any way to check whether a process is blocked when reading from a
> Handle or an Fd? Maybe there are some low-level hacks with unsafeCoerce or
> something that would let me pass a non-handle as a Handle, and do it that
> way?
>
> The only other option is just disabling all uses of stdin, or perhaps
> reimplementing myself the Prelude functions that use stdin. (But this would
> still break libraries that have already compiled in the Prelude versions.)
>
>
> On Sun, Jan 5, 2014 at 2:52 PM, Carter Schonwald <
> carter.schonwald at gmail.com> wrote:
>
>> Hrm.  Have you considered using the ghc API? Ghci itself is written using
>> it, and I imagine you could adapt that code for your purposes perhaps?
>>
>>
>> On Sunday, January 5, 2014, Andrew Gibiansky wrote:
>>
>>> I cannot modify the Haskell code.
>>>
>>> I am working on IHaskell - it is effectively a Haskell interpreter. It
>>> reads some code from the user, which may contain something like `getLine`.
>>> However, the frontend to the interpreter is not a shell but is a GUI in the
>>> web browser (IPython!). In order to do input, the interpreter sends a
>>> message to the frontend via the network saying "give me input", the
>>> frontend reads some input, and then sends things back.
>>>
>>> In order to do this communication, I need to know when the getLine is
>>> called so that I know I need to send the message to the frontend.
>>>
>>> Ideas? The thing is, getLine needs to not actually read from any shell -
>>> it will read from a pipe I create, and I simply need to know when to put
>>> stuff into that pipe.
>>>
>>> -- Andrew
>>>
>>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20140105/92c598e7/attachment.html>


More information about the Haskell-Cafe mailing list