On Tue, May 28, 2019 at 10:38 PM Chris Angelico
On Wed, May 29, 2019 at 6:30 AM Yanghao Hua
wrote: You do realise that repeatedly avoiding the question "what problem do you think you are solving?" does not convincingly make the case that there is a problem to be solved, don't you?
It might be that I am not good enough yet to present it in a way for some of you to better comprehend it. But I do see positive feedbacks too. I plan to stop this discussion here and make a toe-to-toe comparison how it looks like without assignment overloading, how it looks like with assignment overloading, and how it compares with other languages like verilog and Scala/Chisel, and in the meantime to look into some corner cases to make sure the proposed solution can cover all situations.
To repeat what the problem do I think I am solving? A variable, that behaves like an integer (e.g. all normal integer ops should just work), but has a different assignment behavior, such that it can be used to develop equally good hardware descriptions.
So what you want is for this code to behave very very weirdly:
a = thing() a = other_thing() a = another_thing()
Because if one of the things redefines assignment, the subsequent ones are going to do something different.
I recommend sticking with something that's deliberately and consciously namespaced. Descriptors give you a convenient way to do this with dot notation, and a custom object with a __setitem__ method lets you use bracket notation.
stuff = thing_collection() stuff.a = other_thing() stuff.a = another_thing()
This is much clearer, because you can see a distinct difference between initializing the thing and making the thing do stuff. Alternatively, using a different operator works:
a = thing() a += other_thing() a += another_thing()
because augmented assignment IS handled by the target object. (I don't recommend abusing <= for this, as people and linters will get very surprised by that. But that would also work.)
Redefining assignment is a minefield in the languages that support it. Please can you seek a better way to do this?
I'm done posting now. If you're not listening, I'm not going to keep talking.
I am listening of course, I thought we could give it a pause, but same question as before pops up continuously, without building on top of my previous answers, and doesn't even look like what I was proposing. To re-iterate, the overloadable assignment operator I was proposing is not "=", and not "<=". it was "<-", "->", or "<==" "==>" (thanks Ricky for this proposal).