Modified assignment with objects: should it work?

Writing and using Classes in Dyalog APL
Post Reply
petermsiegel
Posts: 159
Joined: Thu Nov 11, 2010 11:04 pm

Modified assignment with objects: should it work?

Post by petermsiegel »

In Dyalog APL, one can use modified assignment, e.g. +← with ordinary variables, including indexed arrays. The question is: Should this work in a comparable way with class instances (class-based objects)?. Specifically, should it work as expected with methods defined via keywords :Property Default Keyed MyMethod in examples like

Code: Select all

a[1 2 3]+←10 100 1000    ⍝ where ¨a¨ is an object defined via ⎕NEW
where 1 2 3 are keys? Before I post a stripped-down test case (and with the caveat that it might always be my error), I wanted to check if it is supposed to work. Two points:

1. APL allows it; it returns no error; it's happily wrong.
2. It seems to work properly on the first key in the vector 1 2 3, but not apply the modifying function + on subsequent elements.
3. I can't find documentation or examples that might guide me. (And yes, I can't count points properly).

Any experience out there?
User avatar
Morten|Dyalog
Posts: 460
Joined: Tue Sep 09, 2008 3:52 pm

Re: Modified assignment with objects: should it work?

Post by Morten|Dyalog »

Hi Peter!

Yes, it should work, with caveats like there being no guarantees on how many times the get and set functions will be called. However, I see that it does NOT work properly, in the simple example that I constructed, only the first index was updated.

I will log an issue and we'll get back to you when it is fixed.

Having said that, I personally avoid the "f←" construct. It only does what you think when f is a scalar primitive; if f is a defined function there is an implied each and performance goes to the dogs. If I were to start again with a blank sheet, my new APL interpreter would not implement this shortcut. It only had one real use case which was efficient frequency counting using repeated indices, but now we have Key for that.
petermsiegel
Posts: 159
Joined: Thu Nov 11, 2010 11:04 pm

Re: Modified assignment with objects: should it work?

Post by petermsiegel »

Morten,
Thanks for testing and updating me/us. I agree it might/should be avoided-- in fact, I had already written a separate method myDict.AddTo to update frequencies of all keys found, but wanted to check the idiomatic myDict+← case for completeness (and to see if there was a performance advantage for either case).

More a curiosity and from my habit of thinking pedagogically about what students will run into.

Best
User avatar
AndyS|Dyalog
Posts: 263
Joined: Tue May 12, 2009 6:06 pm

Re: Modified assignment with objects: should it work?

Post by AndyS|Dyalog »

Well we've fixed the limitation in 18.2 and 19.0, and will be available in the next DSS update. We will also be issuing updated 18.2 installation images for all platforms for all users in the near future. New 19.0 images for all platforms for all users will be made available in a slightly longer timeframe.
User avatar
AndyS|Dyalog
Posts: 263
Joined: Tue May 12, 2009 6:06 pm

Re: Modified assignment with objects: should it work?

Post by AndyS|Dyalog »

Actually, I should qualify the statement "we've fixed the limitation" .. for the Keyed Property a,
a[1 2 3]+←10 100 1000
will work in the forthcoming updates for 18.2 onwards, but for the related
a[2 2]+←10  ⍝ Duplicate indices
and
a[1;1]+←3 ⍝ Higher rank
still both fail - and fixes for these last two will take rather to produce than the first !
petermsiegel
Posts: 159
Joined: Thu Nov 11, 2010 11:04 pm

Re: Modified assignment with objects: should it work?

Post by petermsiegel »

Thanks all for your diligent work. The semantics of repeated indices (with or without keys) can be surprising, especially for novices. Even for "regular" APL objects (and aficionados), we don't think very often about how serial (one at a time, left-to-right) operations like modified assignment +← must be when indexed arrays are the target, to wit:

Code: Select all

      a←0 0 0                ⍝ vanilla vector
      a[1 2 1 2 1 1]+← 1
      a 
0 4 2
Thanks again, all.
Post Reply