[#57574] [ruby-trunk - Feature #8976][Open] file-scope freeze_string directive — "akr (Akira Tanaka)" <akr@...>

70 messages 2013/10/02

[#57579] [ruby-trunk - Feature #8977][Open] String#frozen that takes advantage of the deduping — "sam.saffron (Sam Saffron)" <sam.saffron@...>

25 messages 2013/10/02

[#57679] [ruby-trunk - Feature #8987][Open] map/collect extension which handles arguments — "sowieso (So Wieso)" <sowieso@...>

16 messages 2013/10/05

[#57705] [ruby-trunk - Feature #8992][Open] Use String#freeze and compiler tricks to replace "str"f suffix — "headius (Charles Nutter)" <headius@...>

43 messages 2013/10/07

[#57727] [ruby-trunk - Feature #8998][Open] string keys for hash literals should use fstrings — "normalperson (Eric Wong)" <normalperson@...>

17 messages 2013/10/08

[#57771] [ruby-trunk - Bug #9008][Open] TestProcess#test_clock_getres_constants and TestProcess#test_clock_gettime_constants fails on ARM — "vo.x (Vit Ondruch)" <v.ondruch@...>

15 messages 2013/10/09

[#57888] [ruby-trunk - Feature #9025][Open] Clarify the error message when calling a method with the wrong number of arguments — Nerian (Gonzalo Rodríguez) <siotopo@...>

11 messages 2013/10/15

[#57993] [ruby-trunk - Feature #9047][Open] Alternate hash key syntax for symbols — "jamonholmgren (Jamon Holmgren)" <jamon@...>

13 messages 2013/10/23

[#58007] [ruby-trunk - Feature #9049][Open] Shorthands (a:b, *) for inclusive indexing — "mohawkjohn (John Woods)" <john.o.woods@...>

25 messages 2013/10/24

[#58033] [ruby-trunk - Bug #9053][Open] SSL Issue with Ruby 2.0.0 — "tisba (Sebastian Cohnen)" <ruby-lang@...>

16 messages 2013/10/25

[#58080] [ruby-trunk - Feature #9064][Open] Add support for packages, like in Java — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>

23 messages 2013/10/30

[ruby-core:58027] Re: [ruby-trunk - Feature #9049] Shorthands (a:b, *) for inclusive indexing

From: David MacMahon <davidm@...>
Date: 2013-10-24 18:07:56 UTC
List: ruby-core #58027
On Oct 23, 2013, at 10:36 PM, boris_stitnicky (Boris Stitnicky) wrote:

> @david_macmahon: I do not think that the wish to make a : b an alias =
of a .. b
> can fit into the language anymore. "x > 0 ? 1 : 2 : 3" could be =
ambiguously
> parsed as "x > 0 ? ( 1 : 2 ) : 3" or as "x > 0 ? 1 : ( 2 : 3 )"...

I can think of two ways to work around this problem.

The more drastic option would be to change ?:.  Instead of it being a =
ternary operator, it would be two binary operators ? and :.  The right =
hand side of ? would be a Range constructed via the : operator.  If the =
left hand side of ? is truish, then the Range's "first" element would be =
used, otherwise the Range's "last" element would be used.  There could =
be (in theory, though I'm not sure how practical to implement) an =
optimization that would avoid creating the Range object in the case of =
the `predicate ? value_if_true : value_if_false` idiom.  In this case, =
the your expression would be equivalent to `x > 0 ? 1 : 3` since the =
"step_size" attribute (i.e. 2) would be ignored.

The other far less drastic option would be to use : as a Range "factory" =
only if it is not part of a ?: operator (this is kind of like operator =
precedence).  In this case, your expression would be equivalent to all =
of these:

```ruby
(x > 0 ? 1 : 2) : 3
(x > 0 ? 1 : 2) .. 3
x > 0 ? 1..3 : 2..3
```

In either case, the use of : as a Range "factory" would be disabled in a =
Hash context (unless used in parentheses) so that a:1 will always mean =
{:a =3D> 1} in a Hash context (e.g. as the last argument to a method =
call).

{a:1} =3D> {:a =3D> 1}

{(a:1) =3D> 2} =3D> {a..1 =3D> 2}

{a:(1:2)} =3D> {:a =3D> 1..2}

Using : when passing a Range as the second-to-last argument followed by =
a Hash as the last argument would require parentheses:

foo(a:1, k:2) =3D> foo({:a=3D>b, :k=3D>2})

foo((a:1), k:2) =3D> foo(a..b, {:k=3D>2})

Parentheses could also be used to pass a Range as the final argument =
instead of a Hash:

foo(a:1) =3D> foo({:a =3D> 1})
foo((a:1)) =3D> foo(a..1)

Dave

In This Thread