bug-apl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: A curious bug...


From: Dr . Jürgen Sauermann
Subject: Re: A curious bug...
Date: Tue, 30 May 2023 12:26:26 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0

Hi Emmanuel,

I cant quite explain this fully, but if I copy-and-paste your string below
and print it in hex, then:

eedjsa@server68:~/apl-1.8/src$ echo 'Z ← L foo R' | od -t x1z
0000000 5a 20 e2 86 90 20 4c 20 66 6f 6f 20 52 0a        >Z ... L foo R.<
0000016

which suggests that the sequence e2 86 90 (which, by chance, is
the UTF8 encoding of U+2190 aka. ←) made it into the tokenizer
of GNU APL (which then correctly complains).

In other words, it very much looks to me as if some conversion from
UTF8 encoding to Unicode (aka. UCS) is missing on the way of your
header line from emacs to APL.

Unfortunately I know very little as to how emacs works, maybe
Elias knows better how to troubleshoot this.

Best Regards,
Jürgen


On 5/29/23 19:42, Emmanuel Charpentier wrote:

Le lundi 29 mai 2023 à 18:07 +0200, Dr. Jürgen Sauermann a écrit :

Hi,

the make distclean may overwrite some Makefile.in files
which are shipped with GNU APL.

Normally your ./configure below (without distclean)
in a fresh (yours is now broken) svn co should do it.
what you want.

Done. Not fun...

Now trying in emacs's gnu-apl :

This is the gnu-apl-mode interactive buffer.

To toggle keyboard help, call M-x gnu-apl-show-keyboard (C-c C-k by default).
APL symbols are bound to the standard keys with the Super key. You can also
activate the APL-Z input method (M-x toggle-input-method or C-\) which
allows you to input APL symbols by prefixing the key with a "." (period).

There are several customisation options that can be set.
Click the link or run M-x customize-group RET gnu-apl to set up.

To disable this message, set gnu-apl-show-tips-on-start to nil.

Network listener started. Connection information: mode:tcp addr:33853

                    ______ _   __ __  __    ___     ____   __ 
                   / ____// | / // / / /   /   |   / __ \ / / 
                  / / __ /  |/ // / / /   / /| |  / /_/ // /  
                 / /_/ // /|  // /_/ /   / ___ | / ____// /___
                 \____//_/ |_/ \____/   /_/  |_|/_/    /_____/

                  Welcome to GNU APL version 1.8 / SVN: 1699M

                 Copyright © 2008-2023  Dr. Jürgen Sauermann
                       Banner by FIGlet: www.figlet.org

                This program comes with ABSOLUTELY NO WARRANTY;
                  for details run: /usr/local/bin/apl --gpl.

     This program is free software, and you are welcome to redistribute it
         according to the GNU Public License (GPL) version 3 or later.

      Illegal : in immediate execution+
      ]log 6
    Logging facility 6:  ...    tokenization                 is now ON 
      ∇ Z ← L foo R

gnu-apl opens a window called *gnu-apl edit function* with my header. I fill it ; resulting buffer :

∇Z ← L foo R
  Z ← L + R
∇

Typing this seems normal : I typed the second line in column 1, emacs indented it in col 3 and moves the cursor to the tird line in line 3, column 3, where I type ; the following "Return" makes emacs move the closing to column 1 and the cursor to line 4 column 1.

That's where I type C-c C-c ; which prompts emacs to type

      tokenize: input[13] is: «Z ← L foo R»
  tokenize(13 chars) sees [tag TOK_SYMBOL «Z»] Z ← L foo R
tokenize_symbol() : 13
  tokenize(12 chars) sees [tag TOK_SPACE « »]  ← L foo R
  tokenize(11 chars) sees [tag TOK_VOID «\342»] ← L foo R
Unknown APL character: \342 (U+FFFFFFE2)

in the *gnu-apl buffer.

Correcting the *gnu-apl edit function* buffer to :

∇Z←L foo R
Z←L+R
∇

and typing C-c C-c gets me :

tokenize: input[11] is: «Z←L foo R»
  tokenize(11 chars) sees [tag TOK_SYMBOL «Z»] Z←L foo R
tokenize_symbol() : 11
  tokenize(10 chars) sees [tag TOK_VOID «\342»] ←L foo R
Unknown APL character: \342 (U+FFFFFFE2)

This is where I throw the towel and kills the *gnu-apl buffer. emacs prompts me to kill the interpreter, which I approve.

Restarting, I open gnu-apl in one frame and a temporary *AplTmp* buffer in another frame, where I type :

⍝ test buffer
∇ Z ← L foo R
  Z ← L + R
∇

During this edition, emacs reacts exactly as it did in the del-editor buffer of the first trial.

Typing C-c C-l (= gnu-apl-interactive-send-buffer) gets me :

      tokenize: input[2] is: «⊣⍬»
  tokenize(2 chars) sees [tag TOK_F2_LEFT «⊣»] ⊣⍬
tokenize_function(⊣⍬)
  tokenize(1 chars) sees [tag TOK_F0_ZILDE «⍬»] ⍬
tokenize_function(⍬)
tokenize() done (no error).
   └── tos[2] is: ⊣ VALUE1«≡⊏0⊐»
tokenize: input[11] is: «Z ← L foo R»
  tokenize(11 chars) sees [tag TOK_SYMBOL «Z»] Z ← L foo R
tokenize_symbol() : 11
  tokenize(10 chars) sees [tag TOK_SPACE « »]  ← L foo R
  tokenize(9 chars) sees [tag TOK_ASSIGN «←»] ← L foo R
  tokenize(8 chars) sees [tag TOK_SPACE « »]  L foo R
  tokenize(7 chars) sees [tag TOK_SYMBOL «L»] L foo R
tokenize_symbol() : 7
  tokenize(6 chars) sees [tag TOK_SPACE « »]  foo R
  tokenize(5 chars) sees [tag TOK_SYMBOL «f»] foo R
tokenize_symbol() : 5
  tokenize(2 chars) sees [tag TOK_SPACE « »]  R
  tokenize(1 chars) sees [tag TOK_SYMBOL «R»] R
tokenize_symbol() : 1
tokenize() done (no error).
   └── tos[5] is: 'Z ← 'L 'foo 'R
tokenize: input[0] is: «»
tokenize() done (no error).
   └── tos[0] is:
tokenize: input[11] is: «  Z ← L + R»
  tokenize(11 chars) sees [tag TOK_SPACE « »]   Z ← L + R
  tokenize(10 chars) sees [tag TOK_SPACE « »]  Z ← L + R
  tokenize(9 chars) sees [tag TOK_SYMBOL «Z»] Z ← L + R
tokenize_symbol() : 9
  tokenize(8 chars) sees [tag TOK_SPACE « »]  ← L + R
  tokenize(7 chars) sees [tag TOK_ASSIGN «←»] ← L + R
  tokenize(6 chars) sees [tag TOK_SPACE « »]  L + R
  tokenize(5 chars) sees [tag TOK_SYMBOL «L»] L + R
tokenize_symbol() : 5
  tokenize(4 chars) sees [tag TOK_SPACE « »]  + R
  tokenize(3 chars) sees [tag TOK_F12_PLUS «+»] + R
tokenize_function(+ R)
  tokenize(2 chars) sees [tag TOK_SPACE « »]  R
  tokenize(1 chars) sees [tag TOK_SYMBOL «R»] R
tokenize_symbol() : 1
tokenize() done (no error).
   └── tos[5] is: 'Z ← 'L + 'R
tokenize: input[11] is: «Z ← L foo R»
  tokenize(11 chars) sees [tag TOK_SYMBOL «Z»] Z ← L foo R
tokenize_symbol() : 11
  tokenize(10 chars) sees [tag TOK_SPACE « »]  ← L foo R
  tokenize(9 chars) sees [tag TOK_ASSIGN «←»] ← L foo R
  tokenize(8 chars) sees [tag TOK_SPACE « »]  L foo R
  tokenize(7 chars) sees [tag TOK_SYMBOL «L»] L foo R
tokenize_symbol() : 7
  tokenize(6 chars) sees [tag TOK_SPACE « »]  foo R
  tokenize(5 chars) sees [tag TOK_SYMBOL «f»] foo R
tokenize_symbol() : 5
  tokenize(2 chars) sees [tag TOK_SPACE « »]  R
  tokenize(1 chars) sees [tag TOK_SYMBOL «R»] R
tokenize_symbol() : 1
tokenize() done (no error).
   └── tos[5] is: 'Z ← 'L 'foo 'R
tokenize: input[0] is: «»
tokenize() done (no error).
   └── tos[0] is:
tokenize: input[11] is: «  Z ← L + R»
  tokenize(11 chars) sees [tag TOK_SPACE « »]   Z ← L + R
  tokenize(10 chars) sees [tag TOK_SPACE « »]  Z ← L + R
  tokenize(9 chars) sees [tag TOK_SYMBOL «Z»] Z ← L + R
tokenize_symbol() : 9
  tokenize(8 chars) sees [tag TOK_SPACE « »]  ← L + R
  tokenize(7 chars) sees [tag TOK_ASSIGN «←»] ← L + R
  tokenize(6 chars) sees [tag TOK_SPACE « »]  L + R
  tokenize(5 chars) sees [tag TOK_SYMBOL «L»] L + R
tokenize_symbol() : 5
  tokenize(4 chars) sees [tag TOK_SPACE « »]  + R
  tokenize(3 chars) sees [tag TOK_F12_PLUS «+»] + R
tokenize_function(+ R)
  tokenize(2 chars) sees [tag TOK_SPACE « »]  R
  tokenize(1 chars) sees [tag TOK_SYMBOL «R»] R
tokenize_symbol() : 1
tokenize() done (no error).
   └── tos[5] is: 'Z ← 'L + 'R
tokenize: input[11] is: «  Z ← L + R»
  tokenize(11 chars) sees [tag TOK_SPACE « »]   Z ← L + R
  tokenize(10 chars) sees [tag TOK_SPACE « »]  Z ← L + R
  tokenize(9 chars) sees [tag TOK_SYMBOL «Z»] Z ← L + R
tokenize_symbol() : 9
  tokenize(8 chars) sees [tag TOK_SPACE « »]  ← L + R
  tokenize(7 chars) sees [tag TOK_ASSIGN «←»] ← L + R
  tokenize(6 chars) sees [tag TOK_SPACE « »]  L + R
  tokenize(5 chars) sees [tag TOK_SYMBOL «L»] L + R
tokenize_symbol() : 5
  tokenize(4 chars) sees [tag TOK_SPACE « »]  + R
  tokenize(3 chars) sees [tag TOK_F12_PLUS «+»] + R
tokenize_function(+ R)
  tokenize(2 chars) sees [tag TOK_SPACE « »]  R
  tokenize(1 chars) sees [tag TOK_SYMBOL «R»] R
tokenize_symbol() : 1
tokenize() done (no error).
   └── tos[5] is: 'Z ← 'L + 'R
tokenize: input[11] is: «  Z ← L + R»
  tokenize(11 chars) sees [tag TOK_SPACE « »]   Z ← L + R
  tokenize(10 chars) sees [tag TOK_SPACE « »]  Z ← L + R
  tokenize(9 chars) sees [tag TOK_SYMBOL «Z»] Z ← L + R
tokenize_symbol() : 9
  tokenize(8 chars) sees [tag TOK_SPACE « »]  ← L + R
  tokenize(7 chars) sees [tag TOK_ASSIGN «←»] ← L + R
  tokenize(6 chars) sees [tag TOK_SPACE « »]  L + R
  tokenize(5 chars) sees [tag TOK_SYMBOL «L»] L + R
tokenize_symbol() : 5
  tokenize(4 chars) sees [tag TOK_SPACE « »]  + R
  tokenize(3 chars) sees [tag TOK_F12_PLUS «+»] + R
tokenize_function(+ R)
  tokenize(2 chars) sees [tag TOK_SPACE « »]  R
  tokenize(1 chars) sees [tag TOK_SYMBOL «R»] R
tokenize_symbol() : 1
tokenize() done (no error).
   └── tos[5] is: 'Z ← 'L + 'R
         └── tos[5] is: 'Z ← 'L + 'R

The cursor is still immediately after the end of the last line. Typing a "Return" to get the prompt dets me :

tokenize: input[27] is: «└── tos[5] is: 'Z ← 'L + 'R»
  tokenize(27 chars) sees [tag TOK_END «└»] └── tos[5] is: 'Z ← 'L + ...
SYNTAX ERROR+

Testing the function :

      2 foo 3
tokenize: input[7] is: «2 foo 3»
  tokenize(7 chars) sees [tag TOK_NUMERIC «2»] 2 foo 3
tokenize_number(2 foo 3)
int_digits.size():   '1' at Tokenizer.cc:951
int_digits:          '2' at Tokenizer.cc:952
fract_digits:        '' at Tokenizer.cc:953
expo_digits:         '' at Tokenizer.cc:954
  tokenize_number: integer 2
  tokenize(6 chars) sees [tag TOK_SPACE « »]  foo 3
  tokenize(5 chars) sees [tag TOK_SYMBOL «f»] foo 3
tokenize_symbol() : 5
  tokenize(2 chars) sees [tag TOK_SPACE « »]  3
  tokenize(1 chars) sees [tag TOK_NUMERIC «3»] 3
tokenize_number(3)
int_digits.size():   '1' at Tokenizer.cc:951
int_digits:          '3' at Tokenizer.cc:952
fract_digits:        '' at Tokenizer.cc:953
expo_digits:         '' at Tokenizer.cc:954
  tokenize_number: integer 3
tokenize() done (no error).
   └── tos[3] is: INTEGER 'foo INTEGER
5

shows that the function has been correctly interpreted and created.

Best Regards,

As usual, logs attached.

HTH,

--
Emmanuel Charpentier

[ Snip... ]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]