[ruby-core:95243] [Ruby master Feature#15824] respond_to pattern for pattern match
From:
s.wanabe@...
Date:
2019-10-06 07:56:03 UTC
List:
ruby-core #95243
Issue #15824 has been updated by wanabe (_ wanabe).
The implementation can be very simple.
(I don't know whether `NODE_METHREF` is suitable.)
```diff
diff --git a/compile.c b/compile.c
index 7a88f81daa..f6eafb0ac2 100644
--- a/compile.c
+++ b/compile.c
@@ -5888,6 +5888,11 @@ iseq_compile_pattern_each(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *c
ADD_LABEL(ret, fin);
break;
}
+ case NODE_METHREF: {
+ ADD_INSN1(ret, line, putobject, ID2SYM(node->nd_mid));
+ ADD_SEND(ret, line, idRespond_to, INT2FIX(1));
+ break;
+ }
default:
UNKNOWN_NODE("NODE_IN", node, COMPILE_NG);
}
diff --git a/parse.y b/parse.y
index 287704e14f..dd305479f5 100644
--- a/parse.y
+++ b/parse.y
@@ -3904,6 +3904,10 @@ p_expr_basic : p_value
{
$$ = $2;
}
+ | '.' operation2
+ {
+ $$ = NEW_METHREF(Qundef, $2, &@$);
+ }
;
p_args : p_expr
```
By the way, missing "& pattern" seems to be intended. see [ruby-core:88036] https://bugs.ruby-lang.org/issues/14912#note-7 .
----------------------------------------
Feature #15824: respond_to pattern for pattern match
https://bugs.ruby-lang.org/issues/15824#change-81917
* Author: fukajun (Jun Fukaya)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
----------------------------------------
rubyに追加されそうなパターンマッチの機能について...
Interger, Array など constantを書くことで、オブジェクトのクラスにマッチングさせる機能があるのを拝見しました。
duck typingを確認するようなパターンマッチがかけるとrubyらしいのではないかと思ってこちらに書いてみることにしました。
respond_to pattern
```ruby
class Runner
def run
end
def stop
end
end
runner = Runner.new
case runner
in .run & .stop
:reachable
in .start & .stop
:unreachable
end
```
--
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>