Thank you Jürgen.

I found translating the late John Scholes APL videos on youtube from dyalog
specific syntax to gnu-apl helpful.

For example, here is his "naive" algorithm for counting all the leaf nodes
in a tree:
      dfs ← {⊃∇⍨/⌽(⊂⍺ ⍺⍺ ⍵),⍺ ⍵⍵ ⍵}
      0 {⍺+0=≡⍵} dfs {(0=≡⍵)↓,⍵} (1 2)(3 4)
4

I had a longer write up, but I seem to have solved it whilst
troubleshooting.
Here is the translation if anybody else is interested:
      dfs ← {⊃(⍶ {⍺(⍶ dfs ⍹)⍵} ⍹)/⌽(⊂⍺ ⍶ ⍵),⍺ ⍹ ⍵}
      0 ({⍺+0=≡⍵} dfs {⍺⊢(0=≡⍵)↓,⍵}) (1 2)(3 4)
4

It seems dyalog does some implicit argument passing with the '∇'operator,
as well seems to be less stringent than gnu-apl with regards to
uninitialized arguments (needing '⍺⊢' in right operator function). No
complaints by me, I prefer explicit to implicit.

I will likely continue on with this at some point, so don't be surprised if
I use this thread as a journal.

- Rowan

On Thu, Oct 10, 2019 at 11:22 AM Dr. Jürgen Sauermann <
mail@jürgen-sauermann.de> wrote:

> Hi Rowan,
>
> not sure if it helps, but the term accumulator makes me think of the
> reduction
> operator rather than the rank operator:
>
>
>
> *      {⍺,1+⍵} / 1 2 3  1 3 5 *
> Not sure, though what you want to compute.
>
> The syntax of the rank operator in the ISO standard is IMHO broken. The
> syntax:
>
> Z←f ⍤ y B
>
> has a rather ambiguous right argument *j B* with no rules as to where *j*
> end and *B* begins.
> For example:
>
> Z←f⍤1 2 3 4 5
>
> could mean:
>
> j = 1 and B = 2 3 4 5   or:
> j = 1 2 and B = 3 4 5   or even:
> j = 1 2 3 and B = 4 5
>
> GNU APL uses some crude rules to resolve such cases, but in order
> to get a predictable result, you need to properly use parentheses like
> this:
>
> Z←(f⍤1) 2 3 4 5
>
> or, as a cleaner though non-standard alternative syntax, make *j* an axis
> argument:
>
> Z←f⍤[1] 2 3 4 5
>
> It is very difficult to get all that right, therefore I never use ⍤.
>
> Best Regards,
> Jürgen Sauermann
>
>
> On 10/9/19 9:44 PM, Rowan Cannaday wrote:
>
> this seems to be behaving much better:
>       foo ← {⍺,{((1+1↑⍵) foo 1↓⍵)}⍣(~0=⍴⍵)⊢⍵}
>       ⍬ foo 1 2 3
> 2 3 4
>       5 4 3 foo 1 2 3
> 5 4 3 2 3 4
>
> On Wed, Oct 9, 2019 at 3:40 PM Rowan Cannaday <cannad...@gmail.com> wrote:
>
>> somebody pointed out that the previous fn was failing because i wasn't
>> calling 'foo' w/ dyadic arguments in the inner dfn
>>
>> On Wed, Oct 9, 2019 at 2:16 PM Rowan Cannaday <cannad...@gmail.com>
>> wrote:
>>
>>> interestingly enough this is ok:
>>>       foo ← {⍬{⍺,(1+1↑⍵),(foo 1↓⍵)}⍣(~0=⍴⍵)⍵}
>>>       foo 1 2 3
>>> 2 3 4
>>>
>>> but this isnt:
>>>       foo ← {⍺{⍺,(1+1↑⍵),(foo 1↓⍵)}⍣(~0=⍴⍵)⍵}
>>>       ⍬ foo 1 2 3
>>> VALUE ERROR
>>> foo[1]  λ←⍺ λ1⍣(∼0=⍴⍵)⍵
>>>           ^
>>>       ⎕CR 'foo'
>>> λ←⍺ λ1 ⍵
>>> λ←⍺{⍺,(1+1↑⍵),(foo 1↓⍵)}⍣(~0=⍴⍵)⍵
>>>
>>> On Wed, Oct 9, 2019 at 1:29 PM Rowan Cannaday <cannad...@gmail.com>
>>> wrote:
>>>
>>>> making progress...
>>>>
>>>>       foo ← {{(1+1↑⍵),(foo 1↓⍵)}⍣(~0=⍴⍵)⍵}
>>>>       foo 1 2 3
>>>> 2 3 4
>>>>
>>>> On Wed, Oct 9, 2019 at 12:47 PM Rowan Cannaday <cannad...@gmail.com>
>>>> wrote:
>>>>
>>>>> this is a slightly better way of writing my (still broken) accumulator:
>>>>> acc←{⍺{⍺ acc 1↑⍵}⍣(0=⍴⍵)⊢⍵}
>>>>>
>>>>> On Wed, Oct 9, 2019 at 12:40 PM Rowan Cannaday <cannad...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Given a recursive factorial definition:
>>>>>> fact←{{⍵ × fact ⍵-1}⍣(⍵>2)⊢1⌈⍵}
>>>>>>
>>>>>> [written by Kacper Gutowski in the 'Recursive Lambda' thread]
>>>>>>
>>>>>> I am attempting to write a basic accumulator. This should take an
>>>>>> empty vector as the left value argument, and a rank 1 array as the right
>>>>>> value argument.
>>>>>> Every iteration it should drop a value from the right value, and
>>>>>> append it to the left, until the right value is an empty vector.
>>>>>>
>>>>>> I thought I'd be able to do something like the following:
>>>>>> acc←{⍺,{acc 1↑⍵}⍣(0=⍴⍵)⊢⍵}
>>>>>> ⍬ acc 1 2 3
>>>>>>
>>>>>> But modifying this to say, add a 1 to every number, still returns the
>>>>>> input vector ⍵.
>>>>>>
>>>>>> Thoughts?
>>>>>>
>>>>>>
>>>>>> On Fri, Sep 27, 2019 at 3:44 PM Rowan Cannaday <cannad...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Hello y'all.
>>>>>>>
>>>>>>> I have been attempting to learn function composition & higher-order
>>>>>>> functions in gnu-apl, and how to use it to perform tree traversal.
>>>>>>>
>>>>>>>
>>>>>>> https://en.wikipedia.org/wiki/Function_composition_(computer_science)#APL
>>>>>>> https://en.wikipedia.org/wiki/Higher-order_function#APL
>>>>>>> https://rosettacode.org/wiki/Tree_traversal#APL
>>>>>>>
>>>>>>> Unfortunately a lot of the syntax used is dyalog & dfn specific, so
>>>>>>> working out some of the examples is a bit tricky for myself.
>>>>>>> (the main inconsistencies are '∇' as a recursive function
>>>>>>> definition, ⍺⍺ & ⍵⍵ to refer to left and right operands, '@' as the 'at'
>>>>>>> operator, '⍣' operator differences, as well as possibly others).
>>>>>>>
>>>>>>> Has anybody done 'idiomatic' tree traversal in gnu-apl? Does anybody
>>>>>>> use primitive composition functions in their code?
>>>>>>>
>>>>>>> Trying to figure out what works and feels natural in the language.
>>>>>>> Any examples or guidance would be appreciated.
>>>>>>>
>>>>>>> Examples:
>>>>>>>
>>>>>>> Higher order fns in gnu-apl:
>>>>>>> ∇Z ← (L twice) B
>>>>>>>     Z ← L L B
>>>>>>> ∇
>>>>>>>
>>>>>>> ∇Z ← plusthree B
>>>>>>>     Z ← B + 3
>>>>>>> ∇
>>>>>>>
>>>>>>> ∇Z ← g B
>>>>>>>     Z ← plusthree twice B
>>>>>>> ∇
>>>>>>>
>>>>>>
>

Reply via email to