From: Shugo Maeda Date: 2010-12-02T21:55:16+09:00 Subject: [ruby-core:33519] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods Hi, 2010/11/30 Yusuke ENDOH : >>> Because it requires less indentation, I thought. >> >> I see. �refine without blocks looks confusing for me because it works >> different from refine with a block. > > Maybe another name is needed? > > I think that the short name `refine' is more appropriate to the non- > block style than the block style because I believe the non-block > style is more suitable for casual use. �It requires less indentation, > and it complies with traditional style (like Module#include). It doesn't make sense because Module#include is a very different feature from refine. My proposal is to use modules as namespaces for refinements. So indentation is a necessary evil. Otherwise, we need syntax like Java packages and one file for each package. > A longer (more "meta-programming-like") name would be appropriate to > the block style, such as Module#refine_class, #refine_class_eval, > #class_eval_with_refinement. Meta-programming means programming on programs, so the non-block style is also a meta-programming feature. Why should only the block style be named more "meta-programming-like"? >>> I guess that most of these constructs have reasons why they need >>>> keywords and special syntax. >>> >>> I don't think so. �"class Foo; end" can be written as "Foo = >>> Class.new { }" (though there are indeed subtle differences between >>> them). >> >> "refine Foo do end" is different from "Foo = Class.new {}" because >> "refine Foo do end" looks good, but "Foo = Class.new {}" doesn't. >> I think how it looks is more important than whether it uses keywords or not. > > "refine Foo do def ... end end" looks not so good to me. Could you tell me why refine Foo def bar; end end is good but refine Foo do def bar; end end is not so good? They look similar for me. The latter has "do", but it seems a good word in this context. # I'm not sure because I'm not a good English writer. >>> The API design that "def" statements are put in a Ruby's block, >>> is slightly weird (for me). �I guess that there is no precedent of >>> such a style in Ruby's embedded featues, except meta programming >>> (such as Class.new and class_eval). >>> From now on, does Ruby encourage such a style in casual use? >> >> I think Module#refine is a meta programming feature like class_eval, >> and most application programmers need not use it directly. > > I guess you think so because we are not used to the feature yet. > If it is really just a meta-programming feature, the name should be > more "meta-programming-like". I don't know why meta-programming features should have long names. In Ruby, meta-programming is encouraged, and meta-programming features sometimes have a short name such as eval, but rarely have a keyword. > The non-block style has a precedent (Module#include), so, if it is > adopted, I agree that any new keyword is not needed. �Otherwise, I > prefer a new keyword to a new weird (to me) coding style. Are precedents so important for innovations? -- Shugo Maeda