> > "Perhaps more importantly, what improvement do you propose?"

Apologies for top-posting, but what immediately comes to my mind upon
encountering the creation of a self-referential (circular/infinite)
object is proverbially 'going-down-a-level' and trying again. So I
tried 1. 'decontainerizing' the object on the LHS, and then 2. using
the ",=" postfix to add an additional element (or many). Nothing
worked.

Decont:
https://docs.raku.org/language/glossary#index-entry-decont

Zen slicing as a possible way of 'de-containerizing' :
https://docs.raku.org/language/subscripts#index-entry-Zen_slices

Even if the ",=" postfix operator were to gain this ability on
non-hash objects, then hash-objects would be special-cased in **not**
requiring a Zen-sliced decontainerized object on the LHS, so people
would have to consider that outcome.

Best Regards, Bill.



On Sat, Nov 28, 2020 at 8:33 AM Ralph Mellor <ralphdjmel...@gmail.com> wrote:
>
> > > @r = @r , 'd';
> >
> > Okay, that makes sense.  So the circular reference I thought I
> > was seeing is really there, and it's working as designed.
> >
> > There isn't anything very useful in this behavior though, is there?
>
> Yes.
>
> Here are some relevant results from a search for "self referential" in
> the #perl6 and #raku logs.
>
> 2006 https://colabti.org/irclogger/irclogger_log/perl6?date=2006-01-06#l567
> > stevan: dunno about ML (or whatever TaPL uses), but IIRC scheme's
> letrec is a form of let which allows things to be self referential
>
> 2012 https://colabti.org/irclogger/irclogger_log/perl6?date=2012-01-01#l107
> my $ff=1;
> constant @primes =
> 2, 3, 5,
> -> $n is copy { repeat { $n += 2 + ($ff=!$ff)*2 } until $n %% none
> @primes ... * > sqrt $n; $n; }
> ... *;
> say @primes[^10]; # OUTPUT«2 3 5 7 11 13 17 19 23 29␤»
>
> 2012 https://colabti.org/irclogger/irclogger_log/perl6?date=2012-10-05#l582
> > TimToady: I'd like to get to the point where we can do hamming numbers
> self referentially
> constant @hamming = 1, dedup (@hamming X* 2) M (@hamming X* 3) M
> (@hamming X* 5);
>
> 2014 https://colabti.org/irclogger/irclogger_log/perl6?date=2014-11-02#l823
> > lizmat: my main reason for not pursuing self referential structures in .raku
> > lizmat: was that I didn't have a solution for representing them
> > lizmat: thoughts on that are very welcome
> ....
> > moritz: lizmat: I fear it must be printed out exactly like that
>
> 2015 https://colabti.org/irclogger/irclogger_log/perl6?date=2015-08-17#l1558
> > vendethiel: TimToady: I read the backlog a bit, but I'm not sure I read the
> answer to this question: do you want "my @a = 1, @a" to be (1, 1, 1
> ...) (à la haskell)?
> > TimToady: not sure it makes sense with 'my' due to assignment semantic,
> but would certainly be nice if 'constant' could be self referential
> > TimToady: and we might intuit a lazy if we see the same symbol on the left 
> > and right
> > TimToady: haskell obviously never needs to have explicit lazy, since 
> > everything already is...
> .
> > Also (the immediate point, really) this isn't described very well
> > in the documentation.
>
> I'd say the first focus is best `.raku`. But perhaps it's already optimal.
> Then again, I imagine "thoughts on that are very welcome" still applies.
>
> It's always appropriate to consider improving the doc, especially
> imo if a draft of an improvement is written by, or in cooperation
> with, folk who encountered a problem..
>
> > Just to be thoroughly clear, since with a hash this works ...
> > My first guess was that for arrays, this would work:
> > But here, while @all_at_once is just: [a b c] the array
> > @in_stages has a peculiar structure containing circular references.
>
> Each hash in a list of hashes is automatically flattened:
>
> my %hash = { :a, :b }, { :c, :d }
> say %hash; # {a => True, b => True, c => True, d => True}
>
> Whereas each array in a list of arrays is not:
>
> my @array = [ :a, :b ], [ :c, :d ];
> say @array; # [[a => True b => True] [c => True d => True]]
>
> This is the "class dependent" aspect of the semantics of `=`.
>
> You could create a new array type SteamRolled and bind that:
>
> my @array is SteamRolled = [ :a, :b ], [ :c, :d ];
> say @array; # [a => True b => True, c => True d => True]
>
> Then using the `,=` op would do as you desire.
>
> >    say @r; # ( [<CIRCULAR REFERENCE> d])
>
> "Thoughts are welcome". :)
>
> > And not to quibble too much, but if you didn't want this to do
> > that to the array, then it *is* "mangling" it.
>
> I hear you don't feel sufficiently heard about it being "mangling",
> but I just wanted to be clear it was not doing what you may have
> thought was going on, namely exhibiting an unintended bug.
>
>  > I think that means you're never going to want to do this.
> >  It could be it should even be warning or erroring out.
>
> Per the above IRC discussions, self referential data is useful.
>
> That said, Larry's comment above about perhaps outlawing it
> for `my` variables and instead only allowing it for `constant`s is
> the way to go.
>
> > > It isn't really anything to do with "class dependent" behaviour.
> >
> > In which case, the documentation could use some improvement.
>
> I am always supportive of at least discussing improvement of any
> aspect of Raku, especially in response to someone experiencing
> a surprise or confusion.
>
> My comment above was meant to be about `,=`.
>
> The difference in behaviour between arrays and hashes for what
> they do when a list is assigned *is* class dependent behaviour.
>
> > (Actually, saying that some behavior in Raku is class dependent is
> > kind of redundant... it's all class dependent in one way or another.)
>
> Right. But I think *something* needs to be said about how the LHS
> gets to decide what happens when you use `=` based on the class
> of the LHS..
>
> This is different from what happens with, say, `:=`, where the overall
> behaviour is essentially the same regardless of the class of the LHS.
>
> > > Perhaps more importantly, what improvement do you propose?
> >
> > Well, I just mentioned a few.  I always want to see more examples
> > in the docs.
>
> Write them, collaborating with those working on the doc to improve
> it, and I predict your wishes will come true. :)
>
> > What else would you use ,= with besides a hash?
>
> Any data structure / composite class.
>
> > It could be my confusion here is another form of something else
> > that keeps tripping me up.   Merging two hashes together is
> > pretty simple:
> >
> >   my %h_all = %h1,  %h2;
> >
> > But doing the same thing with arrays is going to require slipping
> > the values out of the containers:
> >
> >   my @a_all = | @a1,  | @a2;
> >
> > So the two cases aren't all that parallel.
>
> Exactly.
>
> Hashes autoflatten by default, because that's the only sensible thing to do.
>
> Arrays do not, because doing flattening by default makes it awkward to
> build data structures.
>
> ----
>
> To be clear, imo someone's sense that something isn't right is
> always entirely valid. and usually a useful thing to bring to the
> table to improve both their own understanding and Raku.
>
> What wasn't so clear to me was how best to discuss it, so I've
> ended up writing very dry stuff. I hope that I haven;t sounded
> dismissive, because I am absolutely not intending to do aught
> but encourage you to stay with what you are journeying thru
> in regard to the impact of trying `,=` with an array, and having
> in mind its use with a hash, and figuring out how to improve
> Raku semantics, gists, doc, or whatever else is appropriate,
>
> Much love to all, raiph

Reply via email to