ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
From: sertackaya@msn.com
To: ruby-core@ruby-lang.org
Subject: [ruby-core:67674] [CommonRuby - Feature #7747] Expanded API for Binding semantics
Date: Sun, 18 Jan 2015 08:09:33 +0000	[thread overview]
Message-ID: <redmine.journal-51090.20150118080932.913c3365c583d99c@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-7747.20130128080812@ruby-lang.org

Issue #7747 has been updated by sertac kaya.


Ürünümüzün yan etkisi yoktur.
http://v-pillsbuyut.com/v-pills-yan-etkileri.html

----------------------------------------
Feature #7747: Expanded API for Binding semantics
https://bugs.ruby-lang.org/issues/7747#change-51090

* Author: Joshua Ballanco
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
=begin
Currently, the only way to create a new instance of Binding is to get a copy of the current scope's binding, or ask some other object for its binding. In either case, the binding object returned always has semantics identical to the original binding. In other words, a binding object used with eval is capable of (not necessarily an exhaustive list):

* redefining methods on the binding target
* defining new methods on the binding target
* getting/setting instance variables
* getting/creating new constants

This feature proposal would introduce a new mechanism for creating a binding and adjusting its relationship with the source binding. For example, if you have a class (({Foo})) defined like so:

    class Foo
      def say
        puts "hello!"
      end
    end

Then you would be able to create a new binding that ((*won't*)) propagate new definitions to the parent binding like so:

    new_binding = Binding.new(Foo)
    new_binding.propagate = false
    new_binding.eval("def shout; puts 'HI!'; end")
    
    Foo.new.say #=> "hello!"
    Foo.new.shout #=> No Method Error
    new_binding.eval("Foo.new.say") #=> "hello"
    new_binding.eval("Foo.new.shout") #=> "HI!"

If, additionally, we introduce a way to merge or combine bindings, then this API could actually be used to implement refinements in pure Ruby like so (note I am also assuming that (({Binding#eval})) gains the ability to take a block):

    class Module
      def refine(klass, &block)
        @refined_bindings ||= {}
        refinement_binding = Binding.new(klass)
        refinement_binding.propagate = false
        refinement_binding.shadow = true
        refinement_binding.eval &block
        (@refined_bindings[self.name] ||= []) << refinement_binding
      end
    
      def using(mod)
        @refined_bindings[mod].each { |refinement| self.binding.merge(refinement) }
      end
    end

Following is the preliminary list of additional APIs I am tentatively proposing (though I expect this to change with additional discussion):

* (({Binding.new(an_object)})) - creates a new Binding object that "inherits" the binding of the argument; essentially equivalent to (({an_object.send(:binding).dup}))
* (({Binding#propagate}))/(({Binding#propagate=})) - boolean; determines whether new method, class, or Constant defs are propagated into the "parent" binding's scope
* (({Binding#shadow}))/(({Binding#shadow=})) - boolean; sets whether or not new values for existing methods/constants/variables can be set
* (({Binding#freeze})) - causes the Binding to capture all existing methods/constants/variables in scope at call time, and "disconnect" from the parent binding, so that any updates to definitions or values are no longer reflected into the "child" binding
* (({Binding#merge(other_binding)})) - combines the method/constant/variable bindings in (({other_binding})) with the receiver; effectively shadows the "parent" of (({other_binding})) within the receiver binding
=end




-- 
https://bugs.ruby-lang.org/

  parent reply	other threads:[~2015-01-18  8:11 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-27 23:09 [ruby-core:51714] [CommonRuby - Feature #7747][Open] Expanded API for Binding semantics jballanc (Joshua Ballanco)
2013-01-27 23:18 ` [ruby-core:51716] [CommonRuby - Feature #7747] " jballanc (Joshua Ballanco)
2013-03-07 22:48 ` [ruby-core:53201] " pasvan (paster okan)
2013-09-23  5:05 ` [ruby-core:57312] " pasvan (paster okan)
2014-03-12 13:52 ` [ruby-core:61436] " bookingfirm
2014-05-12 18:41 ` [ruby-core:62549] " yesilkahvezayiflama
2014-05-12 23:35 ` [ruby-core:62550] " nobu
2014-05-13  0:15 ` [ruby-core:62551] " nobu
2014-11-10 11:15 ` [ruby-core:66170] " sertackaya
2014-11-22 17:13 ` [ruby-core:66417] " sertackaya
2014-11-22 20:45 ` [ruby-core:66418] " sertackaya
2014-11-23 11:21 ` [ruby-core:66426] " sertackaya
2014-11-23 11:21 ` [ruby-core:66427] " sertackaya
2015-01-18  8:09 ` sertackaya [this message]
2015-01-18 19:48 ` [ruby-core:67677] " fatblockshop
2015-02-25  9:15 ` [ruby-core:68305] " sertackaya
2015-07-09  5:09 ` [ruby-core:69904] " 2851820660
2015-07-09  5:10 ` [ruby-core:69905] " 2851820660

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.ruby-lang.org/en/community/mailing-lists/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=redmine.journal-51090.20150118080932.913c3365c583d99c@ruby-lang.org \
    --to=ruby-core@ruby-lang.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).