Hello Jürgen and thanks for the explanation.

Based on what you just explained, I would have assumed the following to
work?

*      m (/⍨) 2 = +/[1] 0 = m ∘.| m←⍳N*
LENGTH ERROR
      m(/⍨)2=+/[1]0=m∘.|m←⍳N

But this variation works?

*      m (/⍨) (2 = +/[1] 0 = m ∘.| m←⍳N)*
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Regards,
Elias

On 26 November 2014 at 21:45, Juergen Sauermann <
juergen.sauerm...@t-online.de> wrote:

>  Hi again,
>
> I have analyzed this a bit further. Below are my conclusions.
>
> 1. Problem description
> --------------------------------
>
> Elias' initial question can be reduced to this: Given APL values *A* and
> *B*, say
>
> *      A←1 2 3 4 5 *and
> *      B←1 1 0 1 0*
>
> how shall the  following expressions be evaluated:
>
> *      A /⍨ B*
> *      A (**/⍨) B*
> *      (A) /⍨ B*
>
> The matter is a bit complicated by the ambiguity of the */ token*:
>
> For historical reasons the token */ *is ambiguous and could mean the
> dyadic function compress or
> the monadic operator reduce. GNU APL resolves this ambiguity at *⎕FX *time
> when possible. For example,
> in *1 2 3 / B *the operator */* is  "downgraded" from  "operator reduce"
> to "function compress" because *1 2 3 *is a value
> and therefore only function compress makes sense. However in *A / B* it
> is not known at *⎕FX* time whether *A* is a function
> or a value. In that case a symbol is assumed to be a function (and hence /
> an operator) while something in parentheses like
> *(A)* is assumed to be a value. That is the reason why *A /**⍨** B* gives
> a syntax error while *(A) /⍨ B* does not. IBM APL2 also
> downgrades */ *from operator reduce to function compress, but at a later
> time.
>
> The behavior of IBM APL2 in that special case is somewhat sub-optimal
> because insisting in / being an operator even
> if it is obviously not leads to the following inconsistency:
>
> IBM APL2:
>
>       *1** (+¨) 1*
> *2*
>       *1** (/¨) 1*
> *SYNTAX ERROR*
>
> GNU APL:
>
> *      1 (+¨) 1*
> *2*
> *      1 (/¨)1*
> * 1*
>
>
> 2. Alternatives
> ---------------------
>
> I have tested what happens if we would introduce a *M M* pattern into GNU
> APL in order to
> get IBM APL2's behavior. In the above examples (I used ¨ instead of Elias'
> original ⍨ because ¨ is
> present in IBM APL2 while ⍨ is not). *(+¨) *is reduced by a pattern *F M 
> *(function
> monadic-operator) to a
> derived function. In contrast  *(/¨) *is not reduced because there is no *M
> M* pattern (except in the cases where
> / was downgraded). The *M M* is shifted  rather than reduced and the
> first *F *in a sequence *F M M* ... causes
> the whole chain to be unrolled from left to right, This is the difference
> that Jay has observed between IBM APL2
> and the others.
>
> Adding a *M M* rule forces the parser to reduce *M M* immediately rather
> than shifting it. After doing that, a few regression
> testcases did fail. Looking at the test results my impression was that the
> current behavior of GNU APL is the preferred one.
>
>
> 3. Conclusion
> --------------------
>
> My conclusion so far is that we should leave things as they are.
>
> Putting things in parentheses is, in my opinion, not such a bad thing and
> it makes programs more explicit and more portable.
>
> When choosing between:
>
> *      A (**/⍨) B* and
> *      (A) /⍨ B*
>
> I would recommend the former because that expresses better what is desired
> and the latter may change at some point in time.
>
> /// Jürgen
>
>
>
> On 11/25/2014 04:01 PM, Juergen Sauermann wrote:
>
> Hi Jay,
>
> yes, what I meant is that / is called like a dyadic function as in 1 1 1 /
> 1 2 3.
>
> But handling it always like an operator could be a better solution.
> Currently in GNU APL operators are distinguished from functions which
> works well
> except for / and friends which are parsed as function in some contexts and
> parsed as operator in others.
>
> I will look into changing this to making operators accept a non-function
> left argument.
>
> /// Jürgen
>
>
>
>  On 11/25/2014 03:33 PM, Jay Foad wrote:
>
> On 25 November 2014 at 14:06, Jay Foad <jay.f...@gmail.com> 
> <jay.f...@gmail.com> wrote:
>
>  On 25 November 2014 at 13:38, Juergen 
> Sauermann<juergen.sauerm...@t-online.de> <juergen.sauerm...@t-online.de> 
> wrote:
>
>  I have read the IBM binding rules a number of times but they seem not to
> help. The problem of these rules is
> that they give different results in the cases where / is an operator and
> where / is a function.
>
>  In IBM APL2 / is always an operator.
>
>  For example:
>
>       1 2/¨3 4 ⍝ GNU APL, NARS2000 and Dyalog: parse as 1 2(/¨)3 4
>  3  4 4
>
>      1 2/¨3 4 ⍝ APL2: parse as (1 2/)¨3 4
>  3 3 3  4 4 4
>
> Jay.
>
>
>
>
>

Reply via email to