Hi Hans-Peter,
I have increased the system limit for operators per statement (!) from
16 to 32.
This system limit is required for performance reasons since it avoids memory
allocations and de-allocations for derived functions.
I would assume that a single APL statement with more than 32 operators
(your example
has 17 EACH operators) will never occur in real-life code.
*SVN 1849*.
In principle every system limit is a compromise that is chosen such that
it will not harm
real life APL code. However, almost every system limit can be exceeded
by constructing
an example that aims at exceeding it. I do not consider that as a design
fault.
Best Regards,
Jürgen
On 3/1/25 20:40, Hans-Peter Sorge wrote:
Hi Jürgen,
* 3 ⎕CR ⍎∊17⍴⊂'(1↑¨''a'')'*
SYSTEM LIMIT (fun_oper)
(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')(1↑¨'a')
^ ^
* 3 ⎕CR ⍎∊16⍴⊂'(1↑¨''a'')'**
*┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓
┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓
┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃
┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃ ┃┏→┓┃
┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃
┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃ ┃┃a┃┃
┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃
┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃ ┃┗━┛┃
┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛
┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛ ┗ϵ━━┛
Looks like there are not more than 16 each Symbols allowed in such an
expression:-)
The operator does not matter ↑ or / or , and may be others.
Bets Regards
Hans-Peter
Am 01.03.25 um 16:35 schrieb Dr. Jürgen Sauermann:
Hi Hans-Peter,
I cannot quite answer your question, but maybe we can
find the problem together. My analysis so far is this:
I started with storing the common part of your c, d, and e in
variable *E*.
With that your examples become:
*
E←⊂¨2 2⍴0/¨⊂,¨2 2 ⍴ 0⍴0
c← E
d← ⊃¨E ⍝ ⊃¨c
e←⊂¨⊃¨E ⍝ ⊂¨⊃¨c expected by d
*
I then checked if ⊂ and ⊃ work as expected with *E*:
*
E ≡ ⊃⊂E
1*
That worked, therefore the suspect became the EACH operator.
I then used a little trick which wraps ⊂ and ⊂ into defined functions:
*
∇Z←ENCL B
Z←⊂B
∇
∇Z←DISCL B
Z←⊃B
∇
E ≡ DISCL ENCL E
1
(⊃ ⊂ E) ≡ DISCL ENCL E
1
*
No surprise yet, just proving that ENCL and DISCL are the same as ⊂
and ⊃.
However: inside GNU APL there is a big difference between ENCL/DISCL
and ⊂/⊃.
The difference (and that is the trick) is that ENCL/DISCL are user
defined which
causes the EACH operator to be executed as a macro (=a built-in
function written
in APL). In contrast ⊂/⊃ are built-in functions written in C/C++ and
in that case
the EACH operator is also executed as a built-in function written in
C/C++.
Since, as we have seen, the macro used with ENCL/DISCL gives the same
result
as the built-in used with ⊂/⊃, the fault (if any) must also be in
the macro. The macro
is actually quite simple (see file *Macro.def* lines 59ff:
*
∇Z←(LO Z__LO_EACH_B) B;rho_Z;N;N_max
rho_Z←⍴B ◊ N←⎕IO ◊ N_max←N+⍴B←,B ◊ Z←N_max⍴0
(N⊃Z)←LO N⊃B ◊ 0 → N_max>N←N+1
Z←rho_Z⍴Z
∇*
The macro is called with LO=ENCL or LO=DISCL and B.
My conclusion so far (and I am running out of ideas) is this:
Either there is no fault, or the fault is in both the macro and in
the C/C++
implementation of the EACH operator. The most likely suspect in my
experience is the pick (monadic ⊃) function.
Best Regards,
Jürgen
On 2/24/25 00:19, Hans-Peter Sorge wrote:
Hi,
The expressions for "a" and "b" yield the proper results:
*a← (⊂¨ 2 2 ⍴⊂,¨2 2 ⍴⍬ )**
b← (⊃¨⊂¨ 2 2 ⍴⊂,¨2 2 ⍴⍬ ) **/⍝⊃¨a/*
/⍝ The disclose in "b" works as expected/
*'ab',¨ ⊂¨ 3 ⎕CR ¨ a b /⍝ expression to represent "a" and "b" in one
line. /*
a ┏━━━━━━━━━┓ ┏━━━━━━━━━┓ b ┏→━━━━━━┓ ┏→━━━━━━┓
┃┏→━━━━━━┓┃ ┃┏→━━━━━━┓┃ ↓┏→┓ ┏→┓┃ ↓┏→┓ ┏→┓┃
┃↓┏→┓ ┏→┓┃┃ ┃↓┏→┓ ┏→┓┃┃ ┃┃0┃ ┃0┃┃ ┃┃0┃ ┃0┃┃
┃┃┃0┃ ┃0┃┃┃ ┃┃┃0┃ ┃0┃┃┃ ┃┗━┛ ┗━┛┃ ┃┗━┛ ┗━┛┃
┃┃┗━┛ ┗━┛┃┃ ┃┃┗━┛ ┗━┛┃┃ ┃┏→┓ ┏→┓┃ ┃┏→┓ ┏→┓┃
┃┃┏→┓ ┏→┓┃┃ ┃┃┏→┓ ┏→┓┃┃ ┃┃0┃ ┃0┃┃ ┃┃0┃ ┃0┃┃
┃┃┃0┃ ┃0┃┃┃ ┃┃┃0┃ ┃0┃┃┃ ┃┗━┛ ┗━┛┃ ┃┗━┛ ┗━┛┃
┃┃┗━┛ ┗━┛┃┃ ┃┃┗━┛ ┗━┛┃┃ ┗ϵ━━━━━━┛ ┗ϵ━━━━━━┛
┃┗ϵ━━━━━━┛┃ ┃┗ϵ━━━━━━┛┃
┗ϵϵ━━━━━━━┛ ┗ϵϵ━━━━━━━┛ ┏→━━━━━━┓ ┏→━━━━━━┓
┏━━━━━━━━━┓ ┏━━━━━━━━━┓ ↓┏→┓ ┏→┓┃ ↓┏→┓ ┏→┓┃
┃┏→━━━━━━┓┃ ┃┏→━━━━━━┓┃ ┃┃0┃ ┃0┃┃ ┃┃0┃ ┃0┃┃
┃↓┏→┓ ┏→┓┃┃ ┃↓┏→┓ ┏→┓┃┃ ┃┗━┛ ┗━┛┃ ┃┗━┛ ┗━┛┃
┃┃┃0┃ ┃0┃┃┃ ┃┃┃0┃ ┃0┃┃┃ ┃┏→┓ ┏→┓┃ ┃┏→┓ ┏→┓┃
┃┃┗━┛ ┗━┛┃┃ ┃┃┗━┛ ┗━┛┃┃ ┃┃0┃ ┃0┃┃ ┃┃0┃ ┃0┃┃
┃┃┏→┓ ┏→┓┃┃ ┃┃┏→┓ ┏→┓┃┃ ┃┗━┛ ┗━┛┃ ┃┗━┛ ┗━┛┃
┃┃┃0┃ ┃0┃┃┃ ┃┃┃0┃ ┃0┃┃┃ ┗ϵ━━━━━━┛ ┗ϵ━━━━━━┛
┃┃┗━┛ ┗━┛┃┃ ┃┃┗━┛ ┗━┛┃┃
┃┗ϵ━━━━━━┛┃ ┃┗ϵ━━━━━━┛┃
┗ϵϵ━━━━━━━┛ ┗ϵϵ━━━━━━━┛
The expression for "c" yields the proper result
The expression for "d" yields an unexpected result - or is it intended?
The expression for "e" yields the result expected by "d":
*c←(⊂¨ 2 2 ⍴0/¨⊂,¨2 2 ⍴ 0⍴0)**
d←(⊃¨⊂¨ 2 2 ⍴0/¨⊂,¨2 2 ⍴ 0⍴0) /⍝ ⊃¨c/
e← (⊂¨⊃¨⊂¨ 2 2 ⍴0/¨⊂,¨2 2 ⍴ 0⍴0)*///*⍝ ⊂¨⊃¨c expected by d*//
//
⍝ Zero rank elements stem from /*0/¨.*
/
⍝ The result from disclose in "d" is unexpected, I expected the
output like in "e".
⍝ The left most enclose /*⊂¨*/in "e" should not be required to get
the proper rank/depth.
⍝ In a more complex variable structure having "a" and "c" elements
⍝ the application of a uniform disclose over each element
⍝ results in "⊃¨a" >> "b" and "⊃¨c" >> "d" elements
⍝ finally causing a domain error.
⍝ If the disclose //in the more complex variable structure //would
result in "⊃¨a" >> "b" and "⊃¨c" >> "e" then the //domain error
disappears.
⍝ Currently I have to check each element within the variable data
structure and transform "d" to "e" where applicable.
//
⍝ Remark: I did some text editing here due to "/⊖/" being two chars
wide. The APL output is correct./
*'cde',¨ ⊂¨3 ⎕CR ¨ c d e**/⍝ expression to represent "c", "d" and
"e" in one line./*
c ┏━━━━━┓ ┏━━━━━┓ d ┏⊖┓┏⊖┓ e ┏━━━┓ ┏━━━┓
┃┏⊖━━┓┃┃┏⊖━━┓┃ ↓0┃ ↓0┃ ┃┏⊖┓┃ ┃┏⊖┓┃
┃↓┏→┓┃┃ ┃↓┏→┓┃┃ ┃0┃ ┃0┃ ┃↓0┃┃ ┃↓0┃┃
┃┃┃0┃┃┃ ┃┃┃0┃┃┃ ┗━┛ ┗━┛ ┃┃0┃┃ ┃┃0┃┃
┃┃┗━┛┃┃ ┃┃┗━┛┃┃ ┃┗━┛┃ ┃┗━┛┃
┃┃┏→┓┃┃ ┃┃┏→┓┃┃ ┏⊖┓┏⊖┓ ┗ϵ━━┛ ┗ϵ━━┛
┃┃┃0┃┃┃ ┃┃┃0┃┃┃ ↓0┃ ↓0┃ ┏━━━┓ ┏━━━┓
┃┃┗━┛┃┃ ┃┃┗━┛┃┃ ┃0┃ ┃0┃ ┃┏⊖┓┃┃┏⊖┓┃
┃┗ϵ━━┛┃ ┃┗ϵ━━┛┃ ┗━┛ ┗━┛ ┃↓0┃┃ ┃↓0┃┃
┗ϵϵ━━━┛ ┗ϵϵ━━━┛ ┃┃0┃┃ ┃┃0┃┃
┏━━━━━┓ ┏━━━━━┓ ┃┗━┛┃ ┃┗━┛┃
┃┏⊖━━┓┃┃┏⊖━━┓┃ ┗ϵ━━┛ ┗ϵ━━┛
┃↓┏→┓┃┃ ┃↓┏→┓┃┃
┃┃┃0┃┃┃ ┃┃┃0┃┃┃
┃┃┗━┛┃┃ ┃┃┗━┛┃┃
┃┃┏→┓┃┃ ┃┃┏→┓┃┃
┃┃┃0┃┃┃ ┃┃┃0┃┃┃
┃┃┗━┛┃┃ ┃┃┗━┛┃┃
┃┗ϵ━━┛┃ ┃┗ϵ━━┛┃
┗ϵϵ━━━┛ ┗ϵϵ━━━┛
An observed side effect:
Placing the expression from a, b, c, d, and e in one line generates
as SYSTEM LIMIT:
3 ⎕CR ¨(⊂¨ 2 2 ⍴⊂,¨2 2 ⍴⍬) (⊃¨⊂¨ 2 2 ⍴⊂,¨2 2 ⍴⍬) (⊂¨ 2 2 ⍴0/¨⊂,¨2 2
⍴ 0⍴0) (⊃¨⊂¨ 2 2 ⍴0/¨⊂,¨2 2 ⍴ 0⍴0) (⊂¨⊃¨⊂¨ 2 2 ⍴0/¨⊂,¨2 2 ⍴ 0⍴0)
SYSTEM LIMIT (fun_oper)
3 ⎕CR¨(⊂¨2 2⍴⊂,¨2 2⍴⍬)(⊃¨⊂¨2 2⍴⊂,¨2 2⍴⍬)(⊂¨2 2⍴0/¨⊂,¨2
2⍴0⍴0)(⊃¨⊂¨2 2⍴0/¨⊂,¨2 2⍴0⍴0)(⊂¨⊃¨⊂¨2 2⍴0/¨⊂,¨2 2⍴0⍴0)
Related problems:
*≡¨a b c d e*
4 3 4 2 3 /⍝ ≡d should be 3
/* ⍴¨¨¨¨c*
DOMAIN ERROR
⍴¨¨¨¨c
^ ^
/⍝ ¨¨¨¨ (4 times each) corresponds to 4 ←→ ≡c, the //DOMAIN
ERROR//is not expected (works with ⍴¨¨¨¨a). /
Best Regards
Hans-Peter