I just got bit by a situation where there was something like this:
obj: make object! [
spec: <whatever>
actor: make object! [
thing: function [port] [
spec: any [global.spec, port.spec]
...
]
]
]
I changed this from a FUNCTION to a LAMBDA, forgetting that changing things from a function (today) changes it from doing SET-WORD! gathering.
That means SPEC: went from being a local variable (like LET SPEC:) and referred to the outer SPEC. It overwrote it.
There's a lot going on here, but it reminds me of an idea I've had that perhaps if you are writing code that wants to access object members you identify annotate that as .member
This is something that languages have struggled with. In C++ people are always wondering if they should be clear and write this->member
or if you should name members specially like m_member. Reading Rust code today it's often littered with the mandatory self.member until SELF is repeated so often in a method you can't read any of the rest of the code.
I had a lot of trouble deciphering Rebmake due to not knowing what was a function, an object, a member, or a global. It's a big advantage just to have dots for member selection distinct from slashes for refinements. But it would be a bigger advantage to be able to see at a glance that something was a member with the relatively brief dot annotation on .member
As with most things pertaining to binding, I have no real clue how to make it work or cohere. But it's something that has been on my mind--and comes back to my attention every time problems with member variables comes up.