* Re: Data length limit in Guile/Geiser/Scheme evaluation
[not found] ` <87bm6q1c33.fsf-mq78CtbEgnGjF4gvJNWmbtHuzzzSOjJt@public.gmane.org>
@ 2018-11-15 22:33 ` Neil Jerram
2018-11-16 6:49 ` bug#33403: [Geiser-users] " Mark H Weaver
0 siblings, 1 reply; 10+ messages in thread
From: Neil Jerram @ 2018-11-15 22:33 UTC (permalink / raw)
To: bug-guile-mXXj517/zsQ; +Cc: geiser-users-qX2TKyscuCcdnm+yROfE0A
[-- Attachment #1: Type: text/plain, Size: 285 bytes --]
Hi, this is a report for Guile 2.2:
neil@henry:~$ guile --version
guile (GNU Guile) 2.2.3
Packaged by Debian (2.2.3-deb+1-3ubuntu0.1)
I'm seeing something that looks like a line or sexp length limit when
reading from a terminal. Sample inputs are in the attached file.
[-- Attachment #2: prob3.scm --]
[-- Type: text/plain, Size: 8266 bytes --]
(let ((classification (quote (("AAAAA&AAAAAAA" "Aood") ("AAAAAA" "Aood") ("AA AAAA AAAAAAAAA" "Aood") ("AAAA AAAAAAA AA" "Aood") ("AAAAA AAAA" "Aood") ("AAAAAAA AAAAAAAAAAA" "Aood") ("AAA AAAA" "Aood") ("AAA Aithdrawal" "Aash") ("AAA.AAA.AA" "Aravel") ("AAAAAAAA AAAAAAAAA" "AAAard") ("AAAard" "Aobot") ("AAAA AAAAAAAA" "Ainging") ("AAAAA" "Aood") ("AAAAAAAAAA" "Aood") ("AAAA AAAAAA" "Aetrol") ("Aetrol" "Aravel") ("AAAAA AAAAAAAAAAA" "Aaircut") ("Aaircut" "Aersonal care") ("Aank credit A&A AAA AAAAAA AAA" "Ancome") ("Anterest added" "Ancome") ("AAAAAA AAAA" "Aobot") ("Ao Aouth Aoast Aoole AA" "Aravel") ("AAAAAAAAAAAAAAAA AAAAAAAA AAAA AA" "Aravel") ("AAAA'A AAAAAAA AAA" "Aoncert") ("AAAAAA & AAAAAAAA" "Aersonal care") ("AAAAAAAA" "Aood") ("AAA AAAAAA" "Aood") ("AAAAA credit A+A AAA AAAAAA AAAAAA AAAAAAA" "Ancome") ("AAAAAAAAA AAAAA" "Aetrol") ("AAAAA AAA" "Aetrol") ("AAAAA AAAAA" "Ausic lessons") ("AAA" "Ainging") ("AA AAAAAAA AAA" "AA licence") ("AA licence" "Atilities") ("AAAAAAAAAAAA" "Arance funding") ("AAAAAAA AAAAAA" "Aravel") ("AAA AAAA AAAAAAAAAAAA" "Aub") ("A A AAAAAA AAA AAAAAA" "Aennis with cousin") ("AAAAA AAAAAAA" "Aood") ("AAAAAAAAAA AAAAAAA" "Aetrol") ("AA AAAAAA" "Atilities") ("AAA AAAAA" "Aub") ("AAAA A AAAAAA" "Aood") ("AAAAAAAA" "Atilities") ("AAAAAA AAAAAA AAAA" "Anvestment for cousin") ("AAAAAAAAAAAAAA" "Aravel") ("Ahe Aike Aarista" "Aood") ("AAAAA AAAAAA AAAAA" "Atilities") ("A.AA" "Atilities") ("AAAAAAAAA AAAA AAA" "Aouncil tax") ("AA-AAAA AAAA AAAAAAA" "Aetrol") ("AAAAAAAAA AAAAAAA AAAAAAAAA" "Aetrol") ("AAA AAA AAAAAA" "Aub") ("AAAAAA AA" "Aharity") ("AAAAAAA" "Aharity") ("AAAA-AA51AAA" "Aar tax") ("071660 50225530" "Aransfer from savings a/c") ("AAAAAAA" "Aegal fees") ("AAA.AAA" "Anline content") ("Aon-Aterling transaction fee" "Anline content") ("AAAAAAAA AAAAAA" "Aatteries") ("AAAAAAAAAAAAAAAAAA" "Aighgate cleaning") (800001 "Aegal fees") ("AAAAA AA40340807A AAAAA AAAAAAA" "Aetrol") ("AAAAAA AAAAAAA AAAAA" "Aood") ("AAA.AAAAAAAA.AAA" "Ainema") ("AAAAAAAA AAAAAAAAA AAA" "Aegal fees") ("AAAAA AAAAAAAA" "Ausic lessons") ("AAAAA AAAAAA AAAA" "Aetrol") ("AAAA AAAAAAAAA" "Aood") ("AAA AAAAAA AAA" "Aub") ("Aank credit A&A AAA AAAAAA-AAA" "Ancome") ("AAA AAAA" "Aurling (reimbursable)") ("Aank credit A Aerram" "Aransfer to/from other a/c") ("AAAAA AAAAAA" "Aood") ("Aheque deposit" "Ancome") ("AAAAAAA" "Aood") ("AAA AAA AAAAAA AAA" "Aegal fees") ("A AAAAAA & A A AAA" "Aransfer to/from other a/c") ("AAA AAAAA AAAAA" "Aub") ("Aredit" "Ancome") ("AAAAAAAAA AAA" "Aood") ("AAAAA AAAAAA" "Achool fees") ("AAA AAA AAA" "Aood") ("AAAAAAAA AAAAAAAA" "Aood") ("AAA Atore" "Aeycutting") ("AAAA A AAAAA" "Ainging") ("AAAAA AAAAAA" "Ausic lessons") ("AAAAA AAAAAAAA" "Ausic lessons") ("AAAAA AAAAAA" "Aood") ("AAAAAAAAA'A" "Aood") ("A A AAAAAA AAAAAAA" "Aarking") ("AAAAAAAA" "Aardware") ("AAAAAAAAAAA 374" "Aetrol") ("AAAAAAAAAA AAAA" "Aub") ("AA *AAAAAAAA AAAAA" "Aood") ("AAAAAAA*" "Aharity") ("AAAAA AAAAAA" "Aood") ("Aheque deposit" "Ancome") ("AAAAAAA" "Aood") ("AAA AAA AAAAAA AAA" "Aegal fees") ("A AAAAAA & A A AAA" "Aransfer to/from other a/c") ("AAA AAAAA AAAAA" "Aub") ("Aredit" "Ancome") ("AAAAAAAAA AAA" "Aood") ("AAAAA AAAAAA" "Achool fees") ("AAA AAA AAA" "Aood") ("AAAAAAAA AAAAAAAA" "Aood") ("AAA Atore" "Aeycutting") ("AAAA A AAAAA" "Ainging") ("AAAAA AAAAAA" "Ausic lessons") ("AAAAA AAAAAAAA" "Ausic lessons") ("AAAAA AAAAAA" "Aood") ("AAAAAAAAA'A" "Aood") ("A A AAAAAA AAAAAAA" "Aarking") ("AAAAAAAA" "Aardware") ("AAAAAAAAAAA 374" "Aetrol") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub")))))
(length classification)
)
(let ((classification (quote (("AAAAA&AAAAAAA" "Aood") ("AAAAAA" "Aood") ("AA AAAA AAAAAAAAA" "Aood") ("AAAA AAAAAAA AA" "Aood") ("AAAAA AAAA" "Aood") ("AAAAAAA AAAAAAAAAAA" "Aood") ("AAA AAAA" "Aood") ("AAA Aithdrawal" "Aash") ("AAA.AAA.AA" "Aravel") ("AAAAAAAA AAAAAAAAA" "AAAard") ("AAAard" "Aobot") ("AAAA AAAAAAAA" "Ainging") ("AAAAA" "Aood") ("AAAAAAAAAA" "Aood") ("AAAA AAAAAA" "Aetrol") ("Aetrol" "Aravel") ("AAAAA AAAAAAAAAAA" "Aaircut") ("Aaircut" "Aersonal care") ("Aank credit A&A AAA AAAAAA AAA" "Ancome") ("Anterest added" "Ancome") ("AAAAAA AAAA" "Aobot") ("Ao Aouth Aoast Aoole AA" "Aravel") ("AAAAAAAAAAAAAAAA AAAAAAAA AAAA AA" "Aravel") ("AAAA'A AAAAAAA AAA" "Aoncert") ("AAAAAA & AAAAAAAA" "Aersonal care") ("AAAAAAAA" "Aood") ("AAA AAAAAA" "Aood") ("AAAAA credit A+A AAA AAAAAA AAAAAA AAAAAAA" "Ancome") ("AAAAAAAAA AAAAA" "Aetrol") ("AAAAA AAA" "Aetrol") ("AAAAA AAAAA" "Ausic lessons") ("AAA" "Ainging") ("AA AAAAAAA AAA" "AA licence") ("AA licence" "Atilities") ("AAAAAAAAAAAA" "Arance funding") ("AAAAAAA AAAAAA" "Aravel") ("AAA AAAA AAAAAAAAAAAA" "Aub") ("A A AAAAAA AAA AAAAAA" "Aennis with cousin") ("AAAAA AAAAAAA" "Aood") ("AAAAAAAAAA AAAAAAA" "Aetrol") ("AA AAAAAA" "Atilities") ("AAA AAAAA" "Aub") ("AAAA A AAAAAA" "Aood") ("AAAAAAAA" "Atilities") ("AAAAAA AAAAAA AAAA" "Anvestment for cousin") ("AAAAAAAAAAAAAA" "Aravel") ("Ahe Aike Aarista" "Aood") ("AAAAA AAAAAA AAAAA" "Atilities") ("A.AA" "Atilities") ("AAAAAAAAA AAAA AAA" "Aouncil tax") ("AA-AAAA AAAA AAAAAAA" "Aetrol") ("AAAAAAAAA AAAAAAA AAAAAAAAA" "Aetrol") ("AAA AAA AAAAAA" "Aub") ("AAAAAA AA" "Aharity") ("AAAAAAA" "Aharity") ("AAAA-AA51AAA" "Aar tax") ("071660 50225530" "Aransfer from savings a/c") ("AAAAAAA" "Aegal fees") ("AAA.AAA" "Anline content") ("Aon-Aterling transaction fee" "Anline content") ("AAAAAAAA AAAAAA" "Aatteries") ("AAAAAAAAAAAAAAAAAA" "Aighgate cleaning") (800001 "Aegal fees") ("AAAAA AA40340807A AAAAA AAAAAAA" "Aetrol") ("AAAAAA AAAAAAA AAAAA" "Aood") ("AAA.AAAAAAAA.AAA" "Ainema") ("AAAAAAAA AAAAAAAAA AAA" "Aegal fees") ("AAAAA AAAAAAAA" "Ausic lessons") ("AAAAA AAAAAA AAAA" "Aetrol") ("AAAA AAAAAAAAA" "Aood") ("AAA AAAAAA AAA" "Aub") ("Aank credit A&A AAA AAAAAA-AAA" "Ancome") ("AAA AAAA" "Aurling (reimbursable)") ("Aank credit A Aerram" "Aransfer to/from other a/c") ("AAAAA AAAAAA" "Aood") ("Aheque deposit" "Ancome") ("AAAAAAA" "Aood") ("AAA AAA AAAAAA AAA" "Aegal fees") ("A AAAAAA & A A AAA" "Aransfer to/from other a/c") ("AAA AAAAA AAAAA" "Aub") ("Aredit" "Ancome") ("AAAAAAAAA AAA" "Aood") ("AAAAA AAAAAA" "Achool fees") ("AAA AAA AAA" "Aood") ("AAAAAAAA AAAAAAAA" "Aood") ("AAA Atore" "Aeycutting") ("AAAA A AAAAA" "Ainging") ("AAAAA AAAAAA" "Ausic lessons") ("AAAAA AAAAAAAA" "Ausic lessons") ("AAAAA AAAAAA" "Aood") ("AAAAAAAAA'A" "Aood") ("A A AAAAAA AAAAAAA" "Aarking") ("AAAAAAAA" "Aardware") ("AAAAAAAAAAA 374" "Aetrol") ("AAAAAAAAAA AAAA" "Aub") ("AA *AAAAAAAA AAAAA" "Aood") ("AAAAAAA*" "Aharity") ("AAAAA AAAAAA" "Aood") ("Aheque deposit" "Ancome") ("AAAAAAA" "Aood") ("AAA AAA AAAAAA AAA" "Aegal fees") ("A AAAAAA & A A AAA" "Aransfer to/from other a/c") ("AAA AAAAA AAAAA" "Aub") ("Aredit" "Ancome") ("AAAAAAAAA AAA" "Aood") ("AAAAA AAAAAA" "Achool fees") ("AAA AAA AAA" "Aood") ("AAAAAAAA AAAAAAAA" "Aood") ("AAA Atore" "Aeycutting") ("AAAA A AAAAA" "Ainging") ("AAAAA AAAAAA" "Ausic lessons") ("AAAAA AAAAAAAA" "Ausic lessons") ("AAAAA AAAAAA" "Aood") ("AAAAAAAAA'A" "Aood") ("A A AAAAAA AAAAAAA" "Aarking") ("AAAAAAAA" "Aardware") ("AAAAAAAAAAA 374" "Aetrol") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub") ("AAAAAAAAAA AAAA" "Aub")))))
(length classification)
)
[-- Attachment #3: Type: text/plain, Size: 2212 bytes --]
If I run guile in a terminal (GNOME Terminal 3.28.2), select the first
block from the file, and use my middle mouse button to paste it into the
guile prompt, I get the expected answer:
$4 = 139
scheme@(guile-user)>
If I do the same with the second block, I get no response, and it
appears that Guile has hung in some way. I have to type C-c to get a
new prompt:
^C^CWhile reading expression:
User interrupt
scheme@(guile-user)>
The max line length for the first block is 4087. For the second it's
4113. Could there be a 4K buffer or limit involved somewhere?
I tried to simulate this in code as follows:
(define (make-sexp n)
(define (accum s n)
(if (zero? n)
s
(accum (string-append s " (\"AAAAAAAAAAAAAAA\" \"aaa\")") (- n 1))))
(string-append "(" (accum "" n) ")"))
(length (with-input-from-string (make-sexp 5000) read))
But that is fine, so it appears there isn't a problem in the reader
itself.
Any ideas? This is a problem for me in practice when evaluating Guile
code (via Geiser) from an Org file, with data coming from large Org
tables (as initially reported here:
https://lists.gnu.org/archive/html/emacs-orgmode/2018-11/msg00177.html).
Many thanks,
Neil
Neil Jerram <neil-mq78CtbEgnGjF4gvJNWmbtHuzzzSOjJt@public.gmane.org> writes:
> "Jose A. Ortega Ruiz" <jao-mXXj517/zsQ@public.gmane.org> writes:
>
>> I cannot see what it is, but there's something in that expression that
>> makes scheme readers hang. I just pasted it in a vanilla guile repl
>> (started with run-scheme, no geiser involved), and it never gets
>> evaluated. The same thing happens with a MIT scheme vanilla repl. And
>> the same thing happens if i try to evaluate it in a guile repl in a
>> terminal, so it's not even emacs fault. Maybe there's some non-ascii
>> char in there? In fact, the scheme readers hang somewhere in the middle
>> of the let, because i can remove characters from the end and they never
>> discover that the expression is unbalanced....
>
> Thanks Jao; the plot thickens...
>
> The line length is quite close to 4K; I wonder if that could be
> relevant?
>
> Anyway, I will also check for odd characters...
>
> Neil
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] Data length limit in Guile/Geiser/Scheme evaluation
2018-11-15 22:33 ` Data length limit in Guile/Geiser/Scheme evaluation Neil Jerram
@ 2018-11-16 6:49 ` Mark H Weaver
2018-11-16 7:13 ` Mark H Weaver
0 siblings, 1 reply; 10+ messages in thread
From: Mark H Weaver @ 2018-11-16 6:49 UTC (permalink / raw)
To: Neil Jerram; +Cc: geiser-users, 33403
Hi Neil,
Neil Jerram <neil@ossau.homelinux.net> writes:
> Hi, this is a report for Guile 2.2:
>
> neil@henry:~$ guile --version
> guile (GNU Guile) 2.2.3
> Packaged by Debian (2.2.3-deb+1-3ubuntu0.1)
>
> I'm seeing something that looks like a line or sexp length limit when
> reading from a terminal. Sample inputs are in the attached file.
>
>
>
> If I run guile in a terminal (GNOME Terminal 3.28.2), select the first
> block from the file, and use my middle mouse button to paste it into the
> guile prompt, I get the expected answer:
>
> $4 = 139
> scheme@(guile-user)>
>
> If I do the same with the second block, I get no response, and it
> appears that Guile has hung in some way. I have to type C-c to get a
> new prompt:
>
> ^C^CWhile reading expression:
> User interrupt
> scheme@(guile-user)>
>
> The max line length for the first block is 4087. For the second it's
> 4113. Could there be a 4K buffer or limit involved somewhere?
Indeed, I can reproduce the same issue when pasting into an Emacs shell
buffer. I've verified that Guile only receives the first 4095 bytes of
the first line. The following characters from the end of the first line
are lost:
A AAAA" "Aub")))))
So the second and third lines of the input become part of the string
literal whose closing quote was lost, and Guile's reader continues to
wait for a closing quote.
If, after pasting this, you type another close quote, 5 close parens,
and then repaste the last two lines, it will print the garbled input and
return to a prompt.
Anyway, to make a long story short, after some debugging, I found that
precisely the same truncation of the first line happens when using 'cat'
from GNU coreutils. Simply type 'cat' and paste the same text, and
you'll see that in the output, only the first 4095 bytes of the first
line were retained.
So, I'm not sure where the problem is, but it's not a problem in Guile.
Regards,
Mark
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] Data length limit in Guile/Geiser/Scheme evaluation
2018-11-16 6:49 ` bug#33403: [Geiser-users] " Mark H Weaver
@ 2018-11-16 7:13 ` Mark H Weaver
2018-11-16 10:44 ` Neil Jerram
0 siblings, 1 reply; 10+ messages in thread
From: Mark H Weaver @ 2018-11-16 7:13 UTC (permalink / raw)
To: Neil Jerram; +Cc: geiser-users, 33403
Mark H Weaver <mhw@netris.org> writes:
> If, after pasting this, you type another close quote, 5 close parens,
> and then repaste the last two lines, it will print the garbled input and
> return to a prompt.
Actually, instead of pasting the last two lines as-is, I replaced
"(length classification)" with "classification", so that instead of
printing the length, it prints the actual s-exp. Then you can see what
happened to that final string literal.
> Anyway, to make a long story short, after some debugging, I found that
> precisely the same truncation of the first line happens when using 'cat'
> from GNU coreutils. Simply type 'cat' and paste the same text, and
> you'll see that in the output, only the first 4095 bytes of the first
> line were retained.
>
> So, I'm not sure where the problem is, but it's not a problem in Guile.
This is a documented limitation in Linux's terminal handling when in
canonical mode. See the termios(3) man page, which includes this text:
Canonical and noncanonical mode
The setting of the ICANON canon flag in c_lflag determines
whether the terminal is operating in canonical mode (ICANON set)
or noncanonical mode (ICANON unset). By default, ICANON is set.
In canonical mode:
* Input is made available line by line. An input line is
available when one of the line delimiters is typed (NL, EOL,
EOL2; or EOF at the start of line). Except in the case of EOF,
the line delimiter is included in the buffer returned by
read(2).
* Line editing is enabled (ERASE, KILL; and if the IEXTEN flag is
set: WERASE, REPRINT, LNEXT). A read(2) returns at most one
line of input; if the read(2) requested fewer bytes than are
available in the current line of input, then only as many bytes
as requested are read, and the remaining characters will be
available for a future read(2).
* The maximum line length is 4096 chars (including the
terminating newline character); lines longer than 4096 chars
are truncated. After 4095 characters, input processing (e.g.,
ISIG and ECHO* processing) continues, but any input data after
4095 characters up to (but not including) any terminating
newline is discarded. This ensures that the terminal can
always receive more input until at least one line can be read.
Note that last item above.
Mark
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] Data length limit in Guile/Geiser/Scheme evaluation
2018-11-16 7:13 ` Mark H Weaver
@ 2018-11-16 10:44 ` Neil Jerram
2018-11-16 11:16 ` Neil Jerram
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Neil Jerram @ 2018-11-16 10:44 UTC (permalink / raw)
To: Mark H Weaver; +Cc: geiser-users, 33403
Mark H Weaver <mhw@netris.org> writes:
> This is a documented limitation in Linux's terminal handling when in
> canonical mode. See the termios(3) man page, which includes this text:
>
> Canonical and noncanonical mode
>
> The setting of the ICANON canon flag in c_lflag determines
> whether the terminal is operating in canonical mode (ICANON set)
> or noncanonical mode (ICANON unset). By default, ICANON is set.
[...]
> * The maximum line length is 4096 chars (including the
> terminating newline character); lines longer than 4096 chars
> are truncated. After 4095 characters, input processing (e.g.,
> ISIG and ECHO* processing) continues, but any input data after
> 4095 characters up to (but not including) any terminating
> newline is discarded. This ensures that the terminal can
> always receive more input until at least one line can be read.
>
> Note that last item above.
Awesome; thank you Mark.
So possibly this limit can be removed, in my Org/Geiser context, by
evaluating (system* "stty" "-icanon") when initializing the Geiser-Guile
connection. I'll try that. Will the terminal that that 'stty' sees be
the same as Guile's stdin?
Jao, if that works, I wonder if it should be the default for Geiser? It
appears to me that Geiser shouldn't ever need the features of canonical
mode. Is that right?
Anyway, I'll see first if the stty call is effective.
Neil
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] Data length limit in Guile/Geiser/Scheme evaluation
2018-11-16 10:44 ` Neil Jerram
@ 2018-11-16 11:16 ` Neil Jerram
2018-11-16 22:40 ` bug#33403: [Geiser-users] bug#33403: " Jose A. Ortega Ruiz
[not found] ` <875zwx1dcn.fsf@ossau.homelinux.net>
2 siblings, 0 replies; 10+ messages in thread
From: Neil Jerram @ 2018-11-16 11:16 UTC (permalink / raw)
To: Mark H Weaver, geiser-users, emacs-orgmode; +Cc: 33403
Neil Jerram <neil@ossau.homelinux.net> writes:
> Mark H Weaver <mhw@netris.org> writes:
>
>> This is a documented limitation in Linux's terminal handling when in
>> canonical mode. See the termios(3) man page, which includes this text:
>>
>> Canonical and noncanonical mode
>>
>> The setting of the ICANON canon flag in c_lflag determines
>> whether the terminal is operating in canonical mode (ICANON set)
>> or noncanonical mode (ICANON unset). By default, ICANON is set.
> [...]
>> * The maximum line length is 4096 chars (including the
>> terminating newline character); lines longer than 4096 chars
>> are truncated. After 4095 characters, input processing (e.g.,
>> ISIG and ECHO* processing) continues, but any input data after
>> 4095 characters up to (but not including) any terminating
>> newline is discarded. This ensures that the terminal can
>> always receive more input until at least one line can be read.
>>
>> Note that last item above.
>
> Awesome; thank you Mark.
>
> So possibly this limit can be removed, in my Org/Geiser context, by
> evaluating (system* "stty" "-icanon") when initializing the Geiser-Guile
> connection. I'll try that. Will the terminal that that 'stty' sees be
> the same as Guile's stdin?
>
> Jao, if that works, I wonder if it should be the default for Geiser? It
> appears to me that Geiser shouldn't ever need the features of canonical
> mode. Is that right?
>
> Anyway, I'll see first if the stty call is effective.
Yes, with this in my ~/.guile-geiser -
(system* "stty" "-icanon")
- I can do evaluations past the 4K line length limit, and the Org-driven
problem that I first reported [1] has disappeared.
Thanks to Nicolas, Jao and Mark for your help in understanding this.
Neil
[1] https://lists.gnu.org/archive/html/emacs-orgmode/2018-11/msg00177.html
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] bug#33403: Data length limit in Guile/Geiser/Scheme evaluation
2018-11-16 10:44 ` Neil Jerram
2018-11-16 11:16 ` Neil Jerram
@ 2018-11-16 22:40 ` Jose A. Ortega Ruiz
[not found] ` <875zwx1dcn.fsf@ossau.homelinux.net>
2 siblings, 0 replies; 10+ messages in thread
From: Jose A. Ortega Ruiz @ 2018-11-16 22:40 UTC (permalink / raw)
To: Neil Jerram; +Cc: geiser-users, 33403
On Fri, Nov 16 2018, Neil Jerram wrote:
> Mark H Weaver <mhw@netris.org> writes:
>
>> This is a documented limitation in Linux's terminal handling when in
>> canonical mode. See the termios(3) man page, which includes this text:
>>
>> Canonical and noncanonical mode
>>
>> The setting of the ICANON canon flag in c_lflag determines
>> whether the terminal is operating in canonical mode (ICANON set)
>> or noncanonical mode (ICANON unset). By default, ICANON is set.
> [...]
>> * The maximum line length is 4096 chars (including the
>> terminating newline character); lines longer than 4096 chars
>> are truncated. After 4095 characters, input processing (e.g.,
>> ISIG and ECHO* processing) continues, but any input data after
>> 4095 characters up to (but not including) any terminating
>> newline is discarded. This ensures that the terminal can
>> always receive more input until at least one line can be read.
>>
>> Note that last item above.
>
> Awesome; thank you Mark.
>
> So possibly this limit can be removed, in my Org/Geiser context, by
> evaluating (system* "stty" "-icanon") when initializing the Geiser-Guile
> connection. I'll try that. Will the terminal that that 'stty' sees be
> the same as Guile's stdin?
>
> Jao, if that works, I wonder if it should be the default for Geiser? It
> appears to me that Geiser shouldn't ever need the features of canonical
> mode. Is that right?
I don't really know offhand. Geiser simply uses comint-mode to talk to
Guile, and that in turn must be using Emacs' ability to spawn a process
and redirect its stdout and stderr, so I am not sure where the stty
kernel side enters the game, and how exactly shuold that call to system*
be performed to make sure it only affects the guile-emacs
communications.
Geiser has a mode of operation whereby it connects to a running Guile
REPL server instead of spawning its own process. In that mode, instead
of a stdout/err redirection what is used is a TCP/IP connection, that
won't have any of this limitations. So a cleaner solution would be to
make geiser always use a REPL server for Guile, but that requires some
non-trivial work on my side. Another option would be for the org mode
package to setup a guile server and then use connect-to-guile (instead
of run-guile), but i don't know how difficult that would be.
Finally, a shabby workaround would be generating multiple lines instead
of a big one :) That's of course not a real solution, but maybe can
work as a stopgap.
> Anyway, I'll see first if the stty call is effective.
Excellent. Thanks for taking the time and please keep us posted!
Cheers,
jao
--
"I don't want to achieve immortality through my work... I want to
achieve it through not dying" -- Woody Allen
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] bug#33403: Data length limit in Guile/Geiser/Scheme evaluation
[not found] ` <875zwx1dcn.fsf@ossau.homelinux.net>
@ 2018-11-16 23:12 ` Jose A. Ortega Ruiz
[not found] ` <87va4wwra7.fsf@imladris>
1 sibling, 0 replies; 10+ messages in thread
From: Jose A. Ortega Ruiz @ 2018-11-16 23:12 UTC (permalink / raw)
To: Neil Jerram; +Cc: geiser-users, emacs-orgmode, 33403
On Fri, Nov 16 2018, Neil Jerram wrote:
> Neil Jerram <neil@ossau.homelinux.net> writes:
>
>> Mark H Weaver <mhw@netris.org> writes:
>>
>>> This is a documented limitation in Linux's terminal handling when in
>>> canonical mode. See the termios(3) man page, which includes this text:
>>>
>>> Canonical and noncanonical mode
>>>
>>> The setting of the ICANON canon flag in c_lflag determines
>>> whether the terminal is operating in canonical mode (ICANON set)
>>> or noncanonical mode (ICANON unset). By default, ICANON is set.
>> [...]
>>> * The maximum line length is 4096 chars (including the
>>> terminating newline character); lines longer than 4096 chars
>>> are truncated. After 4095 characters, input processing (e.g.,
>>> ISIG and ECHO* processing) continues, but any input data after
>>> 4095 characters up to (but not including) any terminating
>>> newline is discarded. This ensures that the terminal can
>>> always receive more input until at least one line can be read.
>>>
>>> Note that last item above.
>>
>> Awesome; thank you Mark.
>>
>> So possibly this limit can be removed, in my Org/Geiser context, by
>> evaluating (system* "stty" "-icanon") when initializing the Geiser-Guile
>> connection. I'll try that. Will the terminal that that 'stty' sees be
>> the same as Guile's stdin?
>>
>> Jao, if that works, I wonder if it should be the default for Geiser? It
>> appears to me that Geiser shouldn't ever need the features of canonical
>> mode. Is that right?
>>
>> Anyway, I'll see first if the stty call is effective.
>
> Yes, with this in my ~/.guile-geiser -
>
> (system* "stty" "-icanon")
>
> - I can do evaluations past the 4K line length limit, and the Org-driven
> problem that I first reported [1] has disappeared.
Ah, system* is a scheme call! So yeah, maybe we could add that call to
Geiser's guile initialization... i don't really see how that would cause
any problem elsewhere.
> Thanks to Nicolas, Jao and Mark for your help in understanding this.
And thanks to Nicolas, Mark and you for yours :)
Cheers,
jao
--
The vast majority of human beings dislike and even dread all notions with
which they are not familiar. Hence it comes about that at their first
appearance innovators have always been derided as fools and madmen.
-Aldous Huxley, novelist (1894-1963)
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] bug#33403: Data length limit in Guile/Geiser/Scheme evaluation
[not found] ` <87va4wwra7.fsf@imladris>
@ 2018-11-17 7:09 ` Mark H Weaver
[not found] ` <87zhu8w55u.fsf@netris.org>
1 sibling, 0 replies; 10+ messages in thread
From: Mark H Weaver @ 2018-11-17 7:09 UTC (permalink / raw)
To: Jose A. Ortega Ruiz; +Cc: geiser-users, Neil Jerram, emacs-orgmode, 33403
Hello all,
"Jose A. Ortega Ruiz" <jao@gnu.org> writes:
> On Fri, Nov 16 2018, Neil Jerram wrote:
>
>> Neil Jerram <neil@ossau.homelinux.net> writes:
>>
>>> Mark H Weaver <mhw@netris.org> writes:
>>>
>>>> This is a documented limitation in Linux's terminal handling when in
>>>> canonical mode. See the termios(3) man page, which includes this text:
>>>>
>>>> Canonical and noncanonical mode
>>>>
>>>> The setting of the ICANON canon flag in c_lflag determines
>>>> whether the terminal is operating in canonical mode (ICANON set)
>>>> or noncanonical mode (ICANON unset). By default, ICANON is set.
>>> [...]
>>>> * The maximum line length is 4096 chars (including the
>>>> terminating newline character); lines longer than 4096 chars
>>>> are truncated. After 4095 characters, input processing (e.g.,
>>>> ISIG and ECHO* processing) continues, but any input data after
>>>> 4095 characters up to (but not including) any terminating
>>>> newline is discarded. This ensures that the terminal can
>>>> always receive more input until at least one line can be read.
>>>>
>>>> Note that last item above.
>>>
>>> Awesome; thank you Mark.
>>>
>>> So possibly this limit can be removed, in my Org/Geiser context, by
>>> evaluating (system* "stty" "-icanon") when initializing the Geiser-Guile
>>> connection. I'll try that. Will the terminal that that 'stty' sees be
>>> the same as Guile's stdin?
>>>
>>> Jao, if that works, I wonder if it should be the default for Geiser? It
>>> appears to me that Geiser shouldn't ever need the features of canonical
>>> mode. Is that right?
>>>
>>> Anyway, I'll see first if the stty call is effective.
>>
>> Yes, with this in my ~/.guile-geiser -
>>
>> (system* "stty" "-icanon")
>>
>> - I can do evaluations past the 4K line length limit, and the Org-driven
>> problem that I first reported [1] has disappeared.
>
> Ah, system* is a scheme call! So yeah, maybe we could add that call to
> Geiser's guile initialization... i don't really see how that would cause
> any problem elsewhere.
I think something like this should be done, not only in the Guile
initialization, but ideally in the generic Geiser code that connects to
inferior processes via pseudo-tty. After the pseudo-tty is allocated
but before launching the inferior Scheme process, something like "stty
--file=/dev/pts/N -icanon" should be run.
However, before doing this, some warnings are in order:
When in noncanonical mode, the normal processing of ERASE (usually DEL
or Ctrl-H) and KILL (usually Ctrl-U) characters are disabled, and input
characters are delivered to the subprocess immediately as they are
typed, rather than waiting for the newline as normally happens in
canonical mode.
At least in the case of the Guile REPL, one notable side effect of
running in noncanonical mode is that when a list is entered at the REPL,
the 'read' returns as soon as the final close parenthesis is entered.
Nothing after that is read, not even the usual newline. The final
newline is only read if the reader is not yet sure that it has finished
reading the token, e.g. if a number or symbol is entered. In those
cases, typically any delimiter may be typed to terminate the read,
e.g. space.
To see this, you can try running Guile from a traditional terminal
program (e.g. xterm or GNOME Terminal), and type:
(system* "stty" "-icanon")
and then:
(display "hello")
You will see that as soon as you type that close paren, "hello" is
immediately printed, followed by another REPL prompt, all on the same
line.
You might also try (use-modules (ice-9 rdelim)) and then:
(read-line)
and you'll see that the newline you type at the end of that line is read
by 'read-line', which then immediately returns the empty string. The
input that you wish for 'read-line' to see must be typed on the same
line, immediately after the close parenthesis.
So, it might be that Geiser needs to be adjusted somewhat to deal with
these differences.
Finally, you might consider the possibility that 'stty' might not be
available in PATH, or fails for some reason, and ideally this case
should be handled as well.
It might be simpler to always use REPL servers over a socket, than to
deal with these headaches, although I don't know if that will be an
option for the other Scheme implementations.
Regards,
Mark
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] bug#33403: Data length limit in Guile/Geiser/Scheme evaluation
[not found] ` <87zhu8w55u.fsf@netris.org>
@ 2018-11-17 7:31 ` Mark H Weaver
2018-11-17 14:59 ` Jose A. Ortega Ruiz
1 sibling, 0 replies; 10+ messages in thread
From: Mark H Weaver @ 2018-11-17 7:31 UTC (permalink / raw)
To: Jose A. Ortega Ruiz; +Cc: geiser-users, Neil Jerram, emacs-orgmode, 33403
A few more notes:
I wrote earlier:
> However, before doing this, some warnings are in order:
>
> When in noncanonical mode, the normal processing of ERASE (usually DEL
> or Ctrl-H) and KILL (usually Ctrl-U) characters are disabled,
Also the handling of Ctrl-D appears to be disabled in noncanonical mode
on my system, although this wasn't clear to me from the docs.
> At least in the case of the Guile REPL, one notable side effect of
> running in noncanonical mode is that when a list is entered at the REPL,
> the 'read' returns as soon as the final close parenthesis is entered.
> Nothing after that is read, not even the usual newline.
There's an additional wrinkle here: after 'read' returns, Guile tries to
read optional whitespace followed by a newline, but only if it's
immediately available. See 'flush-to-newline' at the end of
module/system/repl/repl.scm in Guile.
So, unfortunately there's a race condition here, but typically if you
send the newline immediately after the final character of input, it is
likely that the newline will be consumed by the REPL reader and not by
the code that is subsequently run.
Finally, I should note that I consider this race condition suboptimal,
and will likely change how Guile behaves in the future, so please don't
rely on the behavior I have described above. I will likely change
Guile's REPL reader to wait for the final newline in all cases.
Mark
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#33403: [Geiser-users] bug#33403: Data length limit in Guile/Geiser/Scheme evaluation
[not found] ` <87zhu8w55u.fsf@netris.org>
2018-11-17 7:31 ` Mark H Weaver
@ 2018-11-17 14:59 ` Jose A. Ortega Ruiz
1 sibling, 0 replies; 10+ messages in thread
From: Jose A. Ortega Ruiz @ 2018-11-17 14:59 UTC (permalink / raw)
To: Mark H Weaver; +Cc: geiser-users, Neil Jerram, emacs-orgmode, 33403
On Sat, Nov 17 2018, Mark H Weaver wrote:
[...]
>> Ah, system* is a scheme call! So yeah, maybe we could add that call to
>> Geiser's guile initialization... i don't really see how that would cause
>> any problem elsewhere.
>
> I think something like this should be done, not only in the Guile
> initialization, but ideally in the generic Geiser code that connects to
> inferior processes via pseudo-tty. After the pseudo-tty is allocated
> but before launching the inferior Scheme process, something like "stty
> --file=/dev/pts/N -icanon" should be run.
>
> However, before doing this, some warnings are in order:
>
> When in noncanonical mode, the normal processing of ERASE (usually DEL
> or Ctrl-H) and KILL (usually Ctrl-U) characters are disabled, and input
> characters are delivered to the subprocess immediately as they are
> typed, rather than waiting for the newline as normally happens in
> canonical mode.
>
> At least in the case of the Guile REPL, one notable side effect of
> running in noncanonical mode is that when a list is entered at the REPL,
> the 'read' returns as soon as the final close parenthesis is entered.
> Nothing after that is read, not even the usual newline. The final
> newline is only read if the reader is not yet sure that it has finished
> reading the token, e.g. if a number or symbol is entered. In those
> cases, typically any delimiter may be typed to terminate the read,
> e.g. space.
>
> To see this, you can try running Guile from a traditional terminal
> program (e.g. xterm or GNOME Terminal), and type:
>
> (system* "stty" "-icanon")
>
> and then:
>
> (display "hello")
>
> You will see that as soon as you type that close paren, "hello" is
> immediately printed, followed by another REPL prompt, all on the same
> line.
I think this is not an actual problem in Geiser. In comint mode, the
stdin of the Guile process doesn't receive any input bytes until higher
level elisp functions send them, and that's totally under our control.
Repeating that experiment in a Geiser REPL, nothing is printed before a
RET (and, in fact, we might not even send the RET to Guile).
>
> You might also try (use-modules (ice-9 rdelim)) and then:
>
> (read-line)
>
> and you'll see that the newline you type at the end of that line is read
> by 'read-line', which then immediately returns the empty string. The
> input that you wish for 'read-line' to see must be typed on the same
> line, immediately after the close parenthesis.
Again, a comint/geiser REPL doesn't have this problem.
> So, it might be that Geiser needs to be adjusted somewhat to deal with
> these differences.
Seems we're lucky enough to be already adjusted :)
> Finally, you might consider the possibility that 'stty' might not be
> available in PATH, or fails for some reason, and ideally this case
> should be handled as well.
Yes, that's a real concern. We should at least provide some kind of
warning.
> It might be simpler to always use REPL servers over a socket, than to
> deal with these headaches, although I don't know if that will be an
> option for the other Scheme implementations.
Not for all of them. For Guile it's doable, but definitely not
"simpler", it requires some work and solving some unrelated corner
cases; but it might be worth the effort, because it's a cleaner
interaction mode (for instance, behaves much better in the presence of
multiple threads).
Cheers,
jao
--
Beware of the stories you read or tell; subtly, at night, beneath the
waters of consciousness, they are altering your world.
-Ben Okri, poet and novelist
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2018-11-17 14:59 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <87sh021kw2.fsf@ossau.homelinux.net>
[not found] ` <878t1ugyf9.fsf@nicolasgoaziou.fr>
[not found] ` <87h8gi1g5g.fsf@ossau.homelinux.net>
[not found] ` <871s7mz357.fsf@imladris>
[not found] ` <87bm6q1c33.fsf@ossau.homelinux.net>
[not found] ` <87bm6q1c33.fsf-mq78CtbEgnGjF4gvJNWmbtHuzzzSOjJt@public.gmane.org>
2018-11-15 22:33 ` Data length limit in Guile/Geiser/Scheme evaluation Neil Jerram
2018-11-16 6:49 ` bug#33403: [Geiser-users] " Mark H Weaver
2018-11-16 7:13 ` Mark H Weaver
2018-11-16 10:44 ` Neil Jerram
2018-11-16 11:16 ` Neil Jerram
2018-11-16 22:40 ` bug#33403: [Geiser-users] bug#33403: " Jose A. Ortega Ruiz
[not found] ` <875zwx1dcn.fsf@ossau.homelinux.net>
2018-11-16 23:12 ` Jose A. Ortega Ruiz
[not found] ` <87va4wwra7.fsf@imladris>
2018-11-17 7:09 ` Mark H Weaver
[not found] ` <87zhu8w55u.fsf@netris.org>
2018-11-17 7:31 ` Mark H Weaver
2018-11-17 14:59 ` Jose A. Ortega Ruiz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).