Andrew Barnert wrote:
Link is a language feature that allows multiple variable names to always refer to the same underlying object define in a namespace. For now, if the variable a link with b. I will denote as a >< b or link('a', 'b') a = 2 a >< alpha # link 'a' with 'alpha' b = 3 print(balpha) # print 9 alpha = 3 print(ba) # print 27 How would this work? I can think of a few options, but they all either badly slow down every variable use, don’t work with locals, or require >< to be handled at compile time. Do you have at least a sketch of how this works? Also, do you have a real-life use case? Usually when you want the equivalent of “variable references” in Python, you just stick the value in a list or an explicit namespace; why isn’t that sufficient here? Also, usually you’re doing it to share a reference with a function, not just using another name in the same namespace; why do you need actual references here but not in the more general and more often-desired case? And finally, a whole bunch of questions on behavior: What happens if you del a? Is there a syntax to unlink variables? It seems like you’d want that at least at the interactive REPL. Is there any way to discover whether two names are linked? If you link a >< b and then link b >< c, does
On Sep 22, 2019, at 02:08, Nutchanon Ninyawee me@nutchanon.org wrote: that make a three-way link, or unlink a from b? If you link two locals and capture them both in a closure, are the closures a single cell, or two cells that reference captured names that happen to be linked? What if you link two names in a class body? What if it’s inside code passed to eval or exec with normal locals and globals? Or with a custom dict subclass or Mapping class for one or the other? Can you link arbitrary targets (e.g., self.a >< self.b, or even a >< b[10]), or just bare names? If you call globals(), do you get back some kind of dict-like object that knows about the links (and can be inspected), or something that looks like a plain-old dict but if you assign to its a you also change b, or something that looks like a plain-old dict but if you assign to its a you unlink it?
Q: Do you have at least a sketch of how this works? A: I have no idea how to make this work in c/kernel level. I have no experience in implementing the core language before. Q: What happens if you `del a`? A: `del a` would unbind all linked names. Q: Is there a syntax to unlink variables? It seems like you’d want that at least at the interactive REPL. Q: Is there any way to discover whether two names are linked? A: Yes, there is. It is currently open for design and discussion. Q: If you link `a >< b` and then link `b >< c`, does that make a three-way link, or unlink a from b? A: That makes a three-way link. Q: If you link two locals and capture them both in a closure, are the closures a single cell, or two cells that reference captured names that happen to be linked? Q: What if you link two names in a class body? Q: What if it’s inside code passed to eval or exec with normal locals and globals? Or with a custom dict subclass or Mapping class for one or the other? A: I don't understand the "single cell, or two cells" concept. I bet it relates to inner representation like [this](http://code.activestate.com/recipes/439096-get-the-value-of-a-cell-from-a-cl...). I don’t know much about the implementation. Q: Can you link arbitrary targets (e.g., self.a >< self.b, or even a ><b[10]), or just bare names? A: I would like to limit this to bare names at first for the sake of simplification. Q: If you call `globals()`, do you get back some kind of dict-like object that knows about the links (and can be inspected), or something that looks like a plain-old dict but if you assign to its `a` you also change `b`, or something that looks like a plain-old dict but if you assign to its `a` you unlink it? A: I thinks there should be a `links()` function to inspect linked variables. globals() should behave like a plain-old dict but if you assign to its `a` you also change `b`.