Parley, wasn't it?

I, too, worked around this issue on windows using parley.

-Dan

-------- Original Message --------
On Jul 5, 2020, 13:29, Kristian Lein-Mathisen wrote:

> Hi George,
>
> I think the problem may also be that your primordial thread is blocking all 
> srfi-18 threads in it's (read) call. Possibly in addition to the missing 
> output-flush calls.
>
> I used to get around this in Chicken 4 by using the 'perley' egg, but it's 
> not available for Chicken 5. You could simply (current-input-port 
> (make-perley-port)) and have a non-srfi18-blocking stdin.
>
> Maybe you could see if http://wiki.call-cc.org/eggref/5/breadline or 
> http://wiki.call-cc.org/eggref/5/linenoise could fix it?
>
> Also, I found an old paste where I was having similar issues for 
> subprocesses. You could see if there are some useful tricks in there: 
> http://paste.call-cc.org/paste?id=dc1ec82557b9ea5846ec976a9987d53d83f401e3
>
> In particular, you could try the last snippet:
>
> ;; don't block while reading anything from port p. port p must have an
>
> ;; associated filedescriptor.
>
> (
>
> define
>
> (
>
> make-nonblocking-input-port p
>
> )
>
> (
>
> make-input-port
>
> (
>
> lambda
>
> (
>
> )
>
> (
>
> thread-wait-for-i/o!
>
> (
>
> port->fileno p
>
> )
>
> )
>
> (
>
> read-char p
>
> )
>
> )
>
> (
>
> lambda
>
> (
>
> )
>
> (
>
> char-ready? p
>
> )
>
> )
>
> (
>
> lambda
>
> (
>
> )
>
> (
>
> close-input-port p
>
> )
>
> )
>
> )
>
> )
>
> And then add:
>
> (current-input-port (make-nonblocking-input-port (current-input-port)))
>
> K.
>
> On Sun, Jul 5, 2020, 21:34 George Oliver <georgeolive...@gmail.com> wrote:
>
>> Hello Kristian and thanks for looking into this.
>>
>> On Sun, Jul 5, 2020 at 12:51 AM Kristian Lein-Mathisen
>> <kristianl...@gmail.com> wrote:
>>
>>> The sys##flush-output here is what you're looking for I think. It's 
>>> problably not being called due to tty-input? returning #f. But it might 
>>> work to redefine it to our needs:
>>
>> I think this could possibly work but I couldn't get it working on my
>> system. Example session on my Emacs:
>>
>> ===================
>>
>> CHICKEN
>> (c) 2008-2020, The CHICKEN Team
>> (c) 2000-2007, Felix L. Winkelmann
>> Version 5.2.0 (rev 317468e4)
>> mingw32-windows-gnu-x86-64 [ 64bit dload ptables ]
>>
>> Type ,? for help.
>> #;1> ; loading C:/Users/george/AppData/Roaming/chicken/11/srfi-18.import.so 
>> ...
>> ; loading C:/Users/george/AppData/Roaming/chicken/11/srfi-18.so ...
>> #;2>
>> <------------ here I evaluated define foo from the example code in
>> my first email in the thread
>> #;3> ##sys#read-prompt-hook
>> #<procedure (##sys#read-prompt-hook)>
>> #;4> (set! ##sys#read-prompt-hook (lambda () (display "test> ") 
>> (flush-output)))
>> test> #<thread: thread24> <--------------
>> here I evaluated thread-start!
>> test> foo
>> 10
>> test> foo
>> 10
>> test> foo
>> 10
>> test> ,q
>>
>> Process scheme finished
>>
>> ===================
>>
>> Curiously this behavior is different than evaluating the test without
>> redefining the read-prompt-hook; in that first case repeated evals of
>> foo will iterate the loop in the thread-start!.
>>
>> I got the same result running csi from the WIndows console.
>>
>> I say it could possibly work because it seems like output buffering is
>> an issue here, for reference see
>> https://lists.gnu.org/archive/html/help-gnu-emacs/2006-04/msg00250.html.
>>
>> However I got farther with solution 2!
>>
>>>
>>> ===== possible solution 2 =====
>>>
>>> It's possible that using a real socket might be a feasable workaround. 
>>> `chicken-install nrepl` and start a session (outside of emacs) with
>>>
>>> > csi -R nrepl -e '(nrepl 1234)'
>>
>> I actually had tried this earlier, but since Windows doesn't have the
>> nc utility it wasn't straightforward. I found the netcat Windows
>> utility but it took me a couple of tries to realize Windows was
>> disabling it (via Windows Security protection).
>>
>> Example session:
>>
>> ==============
>>
>> ;; nrepl on (C:\Users\george\bin\chicken-5.2.0\bin\csi.exe -R nrepl -e
>> (nrepl 1234))
>> #;> <---------- here I evaluate the
>> import, not sure why it doesn't print the output
>> #;> <---------- here I evaluate define foo
>> #;> #<thread: thread30> <---------- evaluating thread-start!
>> #;> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> #<procedure (scheme#current-output-port . args)>
>> 0 <--------------- evaluating foo
>> #;>
>>
>> ========================
>>
>> So this seems like it could work!
>>
>> One wrinkle is that csi toplevel commands don't seem to pass through
>> netcat correctly (for example ',q' returns 'Error: unbound variable:
>> unquote'). But that doesn't seem like a show stopper.
>>
>> There is also a possibly more robust long-term solution that I just
>> learned about it. In recent Windows 10 updates MS released ConPTY,
>> which is a new pseudo tty API. See
>> https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/.
>> Currently, when Emacs creates an asynchronous subprocess, it assumes
>> Windows has no PTY and defaults to using a pipe. It seems workable to
>> patch Emacs to use the new ConPTY. I'm going to see about getting this
>> into Emacs.
>>
>> thanks again, George

Reply via email to