https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112013-05-04T12:12:34ZRuby Issue Tracking SystemRuby master - Feature #8365: Make variables objectshttps://redmine.ruby-lang.org/issues/8365?journal_id=391132013-05-04T12:12:34Zmatz (Yukihiro Matsumoto)matz@ruby.or.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Feedback</i></li><li><strong>Assignee</strong> set to <i>matz (Yukihiro Matsumoto)</i></li></ul><p>I am sorry I don't understand the proposal, nothing more than vague idea.<br>
Proposals should be concrete and be able to implement.</p>
<p>Could you describe both the model and the syntax for the proposal?</p>
<p>Matz.</p> Ruby master - Feature #8365: Make variables objectshttps://redmine.ruby-lang.org/issues/8365?journal_id=391372013-05-05T15:26:42ZAnonymous
<ul></ul><p>Here is my understanding of the original author's idea, which, I hope, will not turn out to be dismally and irremediably flawed. Its mind-boggling quality pleasantly intrigues me, as is the case with many extant Ruby features. I was made receptive to the original author's idea, as I just recently implemented emancipated constant magic (<a class="issue tracker-2 status-1 priority-4 priority-default" title="Feature: Constant magic for everyone. (Open)" href="https://redmine.ruby-lang.org/issues/7149">#7149</a>). I don't see such a big difference between constant assignment hooks and variable assignment hooks – Ruby constants, I understood, are just squeamish variables after all.</p>
<p>Firstly, the syntax part of the original proposal ("integer new anintvar 5" and such) is, imho, crap. But the idea of Variable class titillates me. With variables, I see two separate issues:</p>
<ol>
<li>Variable contents (what is assigned to it)</li>
<li>Membership in (speaking in my own terminology) a "club" of variables.</li>
</ol>
<p>Concentrating on 2: Each variable is created a member of some club. For a constant, this club is the namespace, to which the constant belongs. For an instance variable, an instance. For a class variable, a class. For a global constant ... hm ... a club of global constants. For a local variable ... hm ... hm ... a binding? (I really don't know much about how local variables are organized.)</p>
<p>The hierarchy of variable classes, as I feel it, would be:</p>
<ul>
<li>class Variable
<ul>
<li>class Constant < Variable</li>
<li>class InstanceVariable < Variable</li>
<li>class LocalVariable < Variabls</li>
<li>class GlobalConstant would be either < Variable, or < Constant</li>
<li>class ClassVariable would be probably < Variable, less likely < InstanceVariable</li>
</ul>
</li>
</ul>
<p>So this class hierarchy part is a bit vague. I'm not really sure about it. But when I write</p>
<pre><code>foo = 42
</code></pre>
<p>this is what would happen behind the scenes:</p>
<pre><code>LocalVariable.new( :foo, club_of_local_variables ).set( 42 )
</code></pre>
<p>42 would thus be assigned to LocalVariable instance :foo, which would be reachable from the regional club of local variables (binding?). One would be able to create variable subclasses:</p>
<pre><code># This is a "typed" variable that compulsorily applies Array() to its value
class LocalArrayVariable < LocalVariable
def set value
super( Array( value ) )
end
end
</code></pre>
<p>And hooks, that would cause stuff to happen when specially named variables are assigned to:</p>
<pre><code>class << LocalVariable
alias old_new new
def new( symbol, club )
if symbol.to_s.starts_with? "array_" then
LocalArrayVariable.new( symbol.to_s[6..-1].to_sym, club ) # strips away "array_"
else
old_new( symbol, club )
end
end
end
</code></pre>
<p>Maybe this "alias old_new new" is not the best possible hook practice, but nevertheless:</p>
<pre><code>array_foo = 42
</code></pre>
<p>would cause "foo" to be assigned value [42]</p>
<pre><code>foo #=> [42]
</code></pre>
<p>With this, esoteric behavior of sigils ($, @) could be made exoteric, if not, heaven forbid, user modifiable. One could make variables first</p>
<pre><code>module Foo; end
variable = Constant.new :Bar, Foo
</code></pre>
<p>and actually assign them later</p>
<pre><code>variable.set( "Bar" )
Foo::Bar #=> "Bar"
</code></pre>
<p>The variable object could tell us its attributes</p>
<pre><code>variable.name #=> :Bar
variable.club #=> :Foo
# Of course, :club keyword is a joke, I don't know any better name
</code></pre>
<p>hand us its value</p>
<pre><code>variable.get #=> "Bar"
</code></pre>
<p>Whereas</p>
<pre><code>variable = "Bar"
</code></pre>
<p>would simply assign "Bar" string to "variable" variable. Who knows, perhaps what is today known as Binding, could just become a collection of Variable instances?</p>
<p>One also wonders, what would the relationships between variables and their clubs be. Could they abandon their club (and be garbage collected as unreachable)? Could the variables transfer to other clubs? Or could clubs fire them for bad performace? Could they change name? There is potentialy a host of problems, which I as a C-illiterate user, do not fully realize...</p> Ruby master - Feature #8365: Make variables objectshttps://redmine.ruby-lang.org/issues/8365?journal_id=391422013-05-05T21:59:48Zmatz (Yukihiro Matsumoto)matz@ruby.or.jp
<ul></ul><p>Interesting, but this would make Ruby VERY SLOW.<br>
I am not sure whether it's worth the performance degration.</p>
<p>Matz.</p> Ruby master - Feature #8365: Make variables objectshttps://redmine.ruby-lang.org/issues/8365?journal_id=489732014-09-19T05:07:13ZAnonymous
<ul></ul><p>I have noticed newly added Binding#local_variable_get and Binding#local_variable_set. I wanted to express appreciation.</p> Ruby master - Feature #8365: Make variables objectshttps://redmine.ruby-lang.org/issues/8365?journal_id=602092016-08-19T19:21:26Zboris-s (Boris Stitnicky)
<ul></ul><p>I deleted my account by mistake so my earlier posts show as 'Anonymous'. I'm back and curious how this feature request resolves in the end.</p>