From: gotoken@... Date: 2018-05-02T13:53:54+00:00 Subject: [ruby-core:86839] [Ruby trunk Feature#14724] chains of inequalities Issue #14724 has been updated by gotoken (Kentaro Goto). I heard non-comparison use of `#<` in shell.rb http://ruby-doc.org/stdlib-2.5.0/libdoc/shell/rdoc/Shell.html#class-Shell-label-Pipe+-2Fetc-2Fprintcap+into+a+file that uses `<` and `>` for redirection. For example a file copy from src.txt to dst.txt can be written as: ``` sh = Shell.new sh.cat < "src.txt" > "dst.txt" ``` This is an imcompatible case because `Shell::Cat#<` returns non-boolean `Shell::Cat` to processes next `#>` whereas chain expects boolean only. Some options: 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. ---------------------------------------- Feature #14724: chains of inequalities https://bugs.ruby-lang.org/issues/14724#change-71803 * 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: