Issue #14724 has been updated by Eregon (Benoit Daloze).


gotoken (Kentaro Goto) wrote:
> 1. if a non-boolean is returned, treats the rest of chain in the compatible manner.
> 2. detects only same direction operators, e.g., `a < b <= c` is a chain, but `a < b >= c` is not a chain.
> 3. accepts incompatibility.
> 
> I hope 1 if it is possible.

I think (1) is too magic and not consistent.
What if < could return legitimately a boolean or something else? Then a < b <= c would become unpredictable.
Every conversion to boolean in Ruby follows !(v.equal? false || v.equal? nil),
it would be bad to break that by e.g. treating nil completely differently than false in such a case.

(2) makes more sense to me, although it will likely still be occasionally surprising (but hopefully rarely).

(3) seems fine too as I would guess extremely few libraries use comparison operators like that.
At least then everything is consistent, and we only need to patch the little-used Shell class.

----------------------------------------
Feature #14724: chains of inequalities
https://bugs.ruby-lang.org/issues/14724#change-71810

* Author: gotoken (Kentaro Goto)
* Status: Open
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
* Target version: 
----------------------------------------
In mathematics, chain of inequations is a shorthand notation for the conjunction of several inequations involving common expressions. 

For example, `a < b <= c` for `a < b && b <= c`

Chain notation makes code clearer, in particular, long common expression cases will be so. E.g., 

```
cur.to_i - 2 <= timeval.tv_sec <= cur.to_i
```

is easier to read than

```
cur.to_i - 2 <= timeval.tv_sec && timeval.tv_sec <= cur.to_i
```

because in the latter case we have to verify whether `timeval.tv_sec` is common or not by eyes.

Current syntax allows but redefining builtin methods are considered not practical. So here I request as a new syntax for the chains.


### Use cases (applicable conjunctions)

lib/matrix.rb:
```ruby
    unless 0 <= column && column < column_count
```

lib/time.rb documents:
```ruby
    # block.  For example:
    #
    #     Time.parse(...) {|y| 0 <= y && y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
```

spec/ruby/optional/capi/bignum_spec.rb:
```ruby
  raise "Bignum#coerce returned Fixnum" if fixnum_min <= n && n <= fixnum_max
```

test/fiddle/test_import.rb:
```ruby
        assert(cur.to_i - 2 <= timeval.tv_sec && timeval.tv_sec <= cur.to_i)
```

tool/jisx0208.rb:
```ruby
        unless 0x8140 <= sjis && sjis <= 0xFCFC
```




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

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>