[#39810] 2.0 feature questionnaire — SASADA Koichi <ko1@...>

I made a questionnaire "What do you want to introduce in 2.0?" in my

59 messages 2011/10/01
[#39822] Re: 2.0 feature questionnaire — Jeremy Kemper <jeremy@...> 2011/10/02

2011/10/1 SASADA Koichi <[email protected]>:

[#39827] Re: 2.0 feature questionnaire — Yukihiro Matsumoto <matz@...> 2011/10/02

Hi,

[#40324] Re: 2.0 feature questionnaire — Charles Oliver Nutter <headius@...> 2011/10/25

2011/10/1 SASADA Koichi <[email protected]>:

[#39823] Discussion results — SASADA Koichi <ko1@...>

Hi,

34 messages 2011/10/02
[#39840] Re: Discussion results — Intransition <transfire@...> 2011/10/02

I did not have the fortune of attending the discussion, but I would

[#39844] Re: Discussion results — Yukihiro Matsumoto <matz@...> 2011/10/02

Hi,

[#39851] Re: Discussion results (here documents with indents) — "Martin J. Dürst" <duerst@...> 2011/10/03

Hello Matz,

[#39862] Re: Discussion results (here documents with indents) — Yusuke Endoh <mame@...> 2011/10/03

Hello,

[#39874] Re: Discussion results (here documents with indents) — Trans <transfire@...> 2011/10/03

On Mon, Oct 3, 2011 at 8:16 AM, Yusuke Endoh <[email protected]> wrote:

[#39915] [Ruby 1.9 - Feature #5400][Open] Remove flip-flops in 2.0 — Magnus Holm <judofyr@...>

29 messages 2011/10/04

[#39957] [Ruby 1.9 - Bug #5407][Open] Cannot build ruby-1.9.3-rc1 with TDM-GCC 4.6.1 on Windows XP SP3 — Heesob Park <phasis@...>

11 messages 2011/10/05

[#39993] [Ruby 1.9 - Feature #2348] RBTree Should be Added to the Standard Library — David Graham <david.malcom.graham@...>

10 messages 2011/10/06

[#40037] [Ruby 1.9 - Bug #5422][Open] File.fnmatch != Dir.glob # {no,sets} — Suraj Kurapati <sunaku@...>

14 messages 2011/10/07

[#40073] [Ruby 1.9 - Feature #5427][Open] Not complex patch to improve `require` time (load.c) — Yura Sokolov <funny.falcon@...>

31 messages 2011/10/09

[#40090] [Ruby 1.9 - Bug #5433][Open] PTY.spawn Kernel panic on macos lion — Gamaliel Toro <argami@...>

14 messages 2011/10/10

[#40188] [Ruby 2.0 - Feature #5454] keyword arguments — Yukihiro Matsumoto <matz@...>

16 messages 2011/10/17
[#40189] Re: [Ruby 2.0 - Feature #5454] keyword arguments — Evan Phoenix <evan@...> 2011/10/17

This looks very interesting=21 Would someone be willing to translate to e=

[#40191] Re: [Ruby 2.0 - Feature #5454] keyword arguments — Yutaka Hara <yutaka.hara@...> 2011/10/18

Hi,

[#40192] Re: [Ruby 2.0 - Feature #5454] keyword arguments — Yukihiro Matsumoto <matz@...> 2011/10/18

Hi,

[#40259] Counseling — Perry Smith <pedzsan@...>

Ruby and I are back in counseling... Its always the same thing with =

21 messages 2011/10/21
[#40263] Re: Counseling — "Haase, Konstantin" <Konstantin.Haase@...> 2011/10/21

What's your $LC_CTYPE? What OS are you on?

[#40264] Re: Counseling — Gon軋lo Silva <goncalossilva@...> 2011/10/21

Hi all,

[#40266] Re: Counseling — Bill Kelly <billk@...> 2011/10/21

Gon軋lo Silva wrote:

[#40271] Can rubygems save us from "binary-compatibility hell"? — Yusuke Endoh <mame@...>

Hello, rubygems developers --

17 messages 2011/10/22

[#40290] [ruby-trunk - Feature #5474][Assigned] keyword argument — Yusuke Endoh <mame@...>

36 messages 2011/10/23
[#40298] Re: [ruby-trunk - Feature #5474][Assigned] keyword argument — Yukihiro Matsumoto <matz@...> 2011/10/24

Hi,

[#40414] Re: [ruby-trunk - Feature #5474][Assigned] keyword argument — Charles Oliver Nutter <headius@...> 2011/10/26

More refinement below. I think we're on a good path here.

[#40416] Re: [ruby-trunk - Feature #5474][Assigned] keyword argument — Yukihiro Matsumoto <matz@...> 2011/10/26

Hi,

[#40418] Re: [ruby-trunk - Feature #5474][Assigned] keyword argument — Joshua Ballanco <jballanc@...> 2011/10/26

On Wed, Oct 26, 2011 at 2:08 PM, Yukihiro Matsumoto <[email protected]>wrote:

[#40425] Re: [ruby-trunk - Feature #5474][Assigned] keyword argument — Yukihiro Matsumoto <matz@...> 2011/10/27

Hi,

[#40311] [ruby-trunk - Feature #5478][Open] import Set into core, add syntax — Konstantin Haase <Konstantin.Haase@...>

33 messages 2011/10/24

[#40312] [ruby-trunk - Feature #5479][Open] import StringIO into core, add String#to_io — Konstantin Haase <Konstantin.Haase@...>

9 messages 2011/10/24

[#40316] [ruby-trunk - Feature #5481][Open] Gemifying Ruby standard library — Hiroshi Nakamura <nakahiro@...>

86 messages 2011/10/24
[#40334] [ruby-trunk - Feature #5481] Gemifying Ruby standard library — Lucas Nussbaum <lucas@...> 2011/10/25

[#40322] [ruby-trunk - Feature #5482][Open] Rubinius as basis for Ruby 2.0 — Thomas Sawyer <transfire@...>

19 messages 2011/10/25

[#40356] JIT development for MRI — Carter Cheng <cartercheng@...>

Hello,

25 messages 2011/10/25
[#40390] Re: JIT development for MRI — SASADA Koichi <ko1@...> 2011/10/26

Hi,

[#40394] Re: JIT development for MRI — Carter Cheng <cartercheng@...> 2011/10/26

Dear Koichi SASADA,

[#40395] Re: JIT development for MRI — Carter Cheng <cartercheng@...> 2011/10/26

I noticed that you used context threading in YARV. Do you have some analysis

[#40417] Re: JIT development for MRI — SASADA Koichi <ko1@...> 2011/10/26

Thanks for reference.

[#40423] Re: JIT development for MRI — Carter Cheng <cartercheng@...> 2011/10/26

Thanks Koichi.

[#40412] [ruby-trunk - Bug #5486][Open] rb_stat() doesn’t respect input encoding — Nikolai Weibull <now@...>

15 messages 2011/10/26

[#40462] [ruby-trunk - Bug #5492][Open] MinGW Installation with Ruby 1.9.3rc1 Broken — Charlie Savage <cfis@...>

14 messages 2011/10/27

[#40573] [ruby-trunk - Bug #5530][Open] SEEK_SET malfunctions when used with 'append' File.open mode — "Joshua J. Drake" <ruby-lang.jdrake@...>

17 messages 2011/10/31

[#40586] [ruby-trunk - Feature #5531][Open] deep_value for dealing with nested hashes — Kyle Peyton <kylepeyton@...>

19 messages 2011/10/31

[ruby-core:39922] Re: [Ruby 1.9 - Feature #5372][Open] Promote blank? to a core protocol

From: Alex Young <alex@...>
Date: 2011-10-04 10:08:39 UTC
List: ruby-core #39922
On 03/10/11 22:25, Eric Hodel wrote:
> On Oct 2, 2011, at 2:38 PM, Alex Young wrote:
>> Eric Hodel wrote in post #1024462:
>>> On Sep 27, 2011, at 6:52 PM, Alex Young wrote:
>>> Can you show me a description of the opposite?
>>
>> What I mean by "in reverse" is that with the Null Object, we have an
>> instance which silently does the right thing. We don't have to care that
>> it's null, we just call methods on it like we would on a non-Null
>> instance.
>>
>> With a #null? or #blank? method, we instead have a way to ask each
>> instance directly whether it's null, without having to care about its
>> class. If it quacks like a null, then it's null.
> 
> I mean, on the C2 wiki or somewhere else on the internet.  Can you show other languages that have benefited from a similar implementation?  If there is such a document maybe it can help us understand.

To my knowledge it's most similar to Either in Haskell, but you have to
squint a bit to see it:
http://haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Either.html

If you renamed #empty? to #left? the similarity should be a little clearer.

If you look at Perl 6, there's also a stack of similar-looking
functionality around Mu, Failure and Whatever - specifically the
.defined method is close to what I'm thinking, but they've taken it a
*lot* further.

> 
>>>> Because the core API commonly returns nil in error cases..
>>>
>>> Can you show some examples?  I don't seem to write nil checks very often
>>> when using core methods, but maybe I am forgetting.
>>
>> Having a quick look over the core docs, there's quite a few in
>> File::Stat and Process::Status, all the try_convert() methods,
>> Kernel.caller, Kernel.system, arguably String#slice and Regexp#match
>> (although I can't see the latter being reasonably alterable), and
>> Thread#status at least.
> 
> When does caller return a non-Array?

 $ irb
ruby-1.9.2-p290 :001 > caller(22)
 => nil

It's when the depth parameter exceeds the current stack depth.

> 
>>>>   case thingy
>>>>   when Blank
>>>>     # catch-all
>>>>   # other cases
>>>>   end
>>>
>>> What about:
>>>
>>> case thingy
>>> # other cases
>>> else
>>>  # catch-all
>>> end
>>
>> Yep, that's another way to do the same sort of thing, but with a Blank
>> or Null it's more explicit and more flexible.  With a bare
>> "case...else..." you have to handle both correct nulls and erroneous
>> values in the "else" clause. With Null, you can leave the "else" clause
>> purely for handling the error case, where you've somehow got a response
>> you weren't expecting.  I think it's clearer.
> 
> The problem I see is that adding #empty? to every class is confusing.

Part of that is down to the name. #null? is better because it doesn't
imply that the receiver is a container.

You'll notice that I *didn't* suggest an implementation for Symbol:
sometimes it doesn't make sense for any instance of a class to be null.
 You could make the same argument about Numeric, but I've occasionally
found treating #zero? as a null test to be useful in the past.


> 
> Should File::Stat#empty? returning true to mean the file is empty?  Or should it always return false to say "the file exists"

I'd go for the latter, personally.

> What would Process::Status#empty? mean?  Would false mean that the program had exited non-zero or that the program had exited with any status?

I mentioned upthread that it would be useful aliased to #exited?, but
I'd really prefer it to test whether the process was actually running -
from the documentation of #exited? it sounds like processes that
segfault will cause #exited? to return false.

> 
> Kernel#system and Thread#status return true, false, or nil, so combining "non-zero exit" and "command failed" into #empty? isn't clearer to read than 'if system(command) then else abort "#{command} failed" end'

Sure.  I'd say Kernel#system is an interesting example, though.  Say I
was being implementing it as a third-party library, but with a twist:
instead of returning nil on command failure, I want to capture some
details about the failure and wrap them up in a hypothetical
ProcessFailure instance.  Some of the time, I don't care about the
details of the failure, and other times I do, but in no case do I think
of this as warranting an Exception.  Now, if I say:

  class ProcessFailure
    def null?
      true
    end
  end

then when I *don't* care which happened, either the command failing or
it having a non-zero exit, I can just say:

  unless mysystem(foo).null?
    # it worked!
  end

and when I *do* care, it's:

  unless (result = mysystem(foo)).null?
    # it worked!
  else
    # It didn't, so try to do something useful with the error details
    $stderr.puts result.to_s if result
  end

Note that while it might make the conditionals cleaner here, I *can't*
do the obvious thing of:

  class ProcessFailure < FalseClass; end

because that's just not how booleans work.

> While it might make String#split or Regexp#match and try_convert usage clearer, it adds much confusion otherwise.

As I mentioned above, there are definitely cases where null? should
never be true for a given class because if you have a value, it's not
null by definition.  It's simple enough to leave the default #null? ->
false implementation in place for them.

-- 
Alex

In This Thread