ruby-dev (Japanese) list archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-dev:51196] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる
@ 2022-11-16  5:15 tommy (Masahiro Tomita)
  2022-11-16 14:16 ` [ruby-dev:51197] " shugo (Shugo Maeda)
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: tommy (Masahiro Tomita) @ 2022-11-16  5:15 UTC (permalink / raw)
  To: ruby-dev

Issue #19132 has been reported by tommy (Masahiro Tomita).

----------------------------------------
Bug #19132: `**` を引数に指定すると no anonymous keyword rest parameter になる
https://bugs.ruby-lang.org/issues/19132

* Author: tommy (Masahiro Tomita)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.0preview3 (2022-11-14) [arm64-darwin21]
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
Ruby 3.2.0-preview3 で次のスクリプトを実行するとエラーになります。
```ruby
def hoge(a, *, k: nil, **)
  foo(*, **)
end
```

```
% ruby hoge.rb   
hoge.rb:2: no anonymous keyword rest parameter
```

次のようにキーワードパラメータが `**` だけであればエラーになりませんでした。
```ruby
def hoge(a, *, **)
  foo(*, **)
end
```




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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [ruby-dev:51197] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる
  2022-11-16  5:15 [ruby-dev:51196] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる tommy (Masahiro Tomita)
@ 2022-11-16 14:16 ` shugo (Shugo Maeda)
  2022-11-16 23:03 ` [ruby-dev:51198] " shugo (Shugo Maeda)
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: shugo (Shugo Maeda) @ 2022-11-16 14:16 UTC (permalink / raw)
  To: ruby-dev

Issue #19132 has been updated by shugo (Shugo Maeda).


new_args_tail()でkw_argsがある時にANON_KEYWORD_REST_IDがローカル変数のテーブルから削られてしまうようです。
f_kwrestの値をinternal_idからANON_KEYWORD_REST_IDに変えると動くようになりました。

  https://github.com/ruby/ruby/pull/6743

内部的な変数名が変わってtest/ruby/test_ast.rbが失敗するようになったのでその部分は対処しましたが、この修正方法だと他にも問題があるかもしれません。

----------------------------------------
Bug #19132: `**` を引数に指定すると no anonymous keyword rest parameter になる
https://bugs.ruby-lang.org/issues/19132#change-100122

* Author: tommy (Masahiro Tomita)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.0preview3 (2022-11-14) [arm64-darwin21]
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
Ruby 3.2.0-preview3 で次のスクリプトを実行するとエラーになります。
```ruby
def hoge(a, *, k: nil, **)
  foo(*, **)
end
```

```
% ruby hoge.rb   
hoge.rb:2: no anonymous keyword rest parameter
```

次のようにキーワードパラメータが `**` だけであればエラーになりませんでした。
```ruby
def hoge(a, *, **)
  foo(*, **)
end
```




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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [ruby-dev:51198] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる
  2022-11-16  5:15 [ruby-dev:51196] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる tommy (Masahiro Tomita)
  2022-11-16 14:16 ` [ruby-dev:51197] " shugo (Shugo Maeda)
@ 2022-11-16 23:03 ` shugo (Shugo Maeda)
  2022-11-17  3:23 ` [ruby-dev:51199] " nobu (Nobuyoshi Nakada)
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: shugo (Shugo Maeda) @ 2022-11-16 23:03 UTC (permalink / raw)
  To: ruby-dev

Issue #19132 has been updated by shugo (Shugo Maeda).


shugo (Shugo Maeda) wrote in #note-1:
> 内部的な変数名が変わってtest/ruby/test_ast.rbが失敗するようになったのでその部分は対処しましたが、この修正方法だと他にも問題があるかもしれません。

案の定RBSのテストで失敗したのでANON_KEYWORD_REST_IDを内部IDに変えてみたのですが、今度はUnboundMethod#parametersなどで `:**` が返ることを期待しているテストがコケるようになってしまいました。

https://github.com/ruby/ruby/pull/6743#issuecomment-1317787459

内部IDか `:**` のどちらかに統一して、必要ならこれらのテストかRBSを修正した方がいい気がするのですが、どうするのがいいでしょう。


----------------------------------------
Bug #19132: `**` を引数に指定すると no anonymous keyword rest parameter になる
https://bugs.ruby-lang.org/issues/19132#change-100131

* Author: tommy (Masahiro Tomita)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.0preview3 (2022-11-14) [arm64-darwin21]
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
Ruby 3.2.0-preview3 で次のスクリプトを実行するとエラーになります。
```ruby
def hoge(a, *, k: nil, **)
  foo(*, **)
end
```

```
% ruby hoge.rb   
hoge.rb:2: no anonymous keyword rest parameter
```

次のようにキーワードパラメータが `**` だけであればエラーになりませんでした。
```ruby
def hoge(a, *, **)
  foo(*, **)
end
```




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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [ruby-dev:51199] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる
  2022-11-16  5:15 [ruby-dev:51196] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる tommy (Masahiro Tomita)
  2022-11-16 14:16 ` [ruby-dev:51197] " shugo (Shugo Maeda)
  2022-11-16 23:03 ` [ruby-dev:51198] " shugo (Shugo Maeda)
@ 2022-11-17  3:23 ` nobu (Nobuyoshi Nakada)
  2022-11-17  3:32 ` [ruby-dev:51200] " shugo (Shugo Maeda)
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: nobu (Nobuyoshi Nakada) @ 2022-11-17  3:23 UTC (permalink / raw)
  To: ruby-dev

Issue #19132 has been updated by nobu (Nobuyoshi Nakada).


`:**`に統一でいいのではないでしょうか。

----------------------------------------
Bug #19132: `**` を引数に指定すると no anonymous keyword rest parameter になる
https://bugs.ruby-lang.org/issues/19132#change-100134

* Author: tommy (Masahiro Tomita)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.0preview3 (2022-11-14) [arm64-darwin21]
* Backport: 2.7: DONTNEED, 3.0: DONTNEED, 3.1: DONTNEED
----------------------------------------
Ruby 3.2.0-preview3 で次のスクリプトを実行するとエラーになります。
```ruby
def hoge(a, *, k: nil, **)
  foo(*, **)
end
```

```
% ruby hoge.rb   
hoge.rb:2: no anonymous keyword rest parameter
```

次のようにキーワードパラメータが `**` だけであればエラーになりませんでした。
```ruby
def hoge(a, *, **)
  foo(*, **)
end
```




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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [ruby-dev:51200] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる
  2022-11-16  5:15 [ruby-dev:51196] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる tommy (Masahiro Tomita)
                   ` (2 preceding siblings ...)
  2022-11-17  3:23 ` [ruby-dev:51199] " nobu (Nobuyoshi Nakada)
@ 2022-11-17  3:32 ` shugo (Shugo Maeda)
  2022-11-17  8:52 ` [ruby-dev:51201] " shugo (Shugo Maeda)
  2022-11-17  9:09 ` [ruby-dev:51202] " yui-knk (Kaneko Yuichiro)
  5 siblings, 0 replies; 7+ messages in thread
From: shugo (Shugo Maeda) @ 2022-11-17  3:32 UTC (permalink / raw)
  To: ruby-dev

Issue #19132 has been updated by shugo (Shugo Maeda).


nobu (Nobuyoshi Nakada) wrote in #note-4:
> `:**`に統一でいいのではないでしょうか。

Rubyレベルで公開されている情報が `:**` なので私もそちらに合わせる方がよいように思います。

----------------------------------------
Bug #19132: `**` を引数に指定すると no anonymous keyword rest parameter になる
https://bugs.ruby-lang.org/issues/19132#change-100135

* Author: tommy (Masahiro Tomita)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.0preview3 (2022-11-14) [arm64-darwin21]
* Backport: 2.7: DONTNEED, 3.0: DONTNEED, 3.1: DONTNEED
----------------------------------------
Ruby 3.2.0-preview3 で次のスクリプトを実行するとエラーになります。
```ruby
def hoge(a, *, k: nil, **)
  foo(*, **)
end
```

```
% ruby hoge.rb   
hoge.rb:2: no anonymous keyword rest parameter
```

次のようにキーワードパラメータが `**` だけであればエラーになりませんでした。
```ruby
def hoge(a, *, **)
  foo(*, **)
end
```




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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [ruby-dev:51201] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる
  2022-11-16  5:15 [ruby-dev:51196] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる tommy (Masahiro Tomita)
                   ` (3 preceding siblings ...)
  2022-11-17  3:32 ` [ruby-dev:51200] " shugo (Shugo Maeda)
@ 2022-11-17  8:52 ` shugo (Shugo Maeda)
  2022-11-17  9:09 ` [ruby-dev:51202] " yui-knk (Kaneko Yuichiro)
  5 siblings, 0 replies; 7+ messages in thread
From: shugo (Shugo Maeda) @ 2022-11-17  8:52 UTC (permalink / raw)
  To: ruby-dev

Issue #19132 has been updated by shugo (Shugo Maeda).


shugo (Shugo Maeda) wrote in #note-5:
> nobu (Nobuyoshi Nakada) wrote in #note-4:
> > `:**`に統一でいいのではないでしょうか。
> 
> Rubyレベルで公開されている情報が `:**` なので私もそちらに合わせる方がよいように思います。

上記の修正でRBSのテストがこけるのを調べてみたのですが、RubyVM::ASTのテストが通るように以下の修正をしたせいでした。

```
--- a/ast.c
+++ b/ast.c
@@ -348,6 +348,7 @@ static VALUE
 var_name(ID id)
 {
     if (!id) return Qnil;
+    if (!rb_is_local_id(id)) return Qnil;
     if (!rb_id2str(id)) return Qnil;
     return ID2SYM(id);
 }
```

変数名が `**` の時に名前なし扱いするためでしたが、これが `def foo(...)` とかで定義される `*` なども隠してしまっていたようです。
`**` の時だけ隠すという修正もできますが、UnboundMethod#parametersなどでは `**` という変数名が見えているので、RubyVM::ASTも合わせた方がいいように思います。


----------------------------------------
Bug #19132: `**` を引数に指定すると no anonymous keyword rest parameter になる
https://bugs.ruby-lang.org/issues/19132#change-100148

* Author: tommy (Masahiro Tomita)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.0preview3 (2022-11-14) [arm64-darwin21]
* Backport: 2.7: DONTNEED, 3.0: DONTNEED, 3.1: DONTNEED
----------------------------------------
Ruby 3.2.0-preview3 で次のスクリプトを実行するとエラーになります。
```ruby
def hoge(a, *, k: nil, **)
  foo(*, **)
end
```

```
% ruby hoge.rb   
hoge.rb:2: no anonymous keyword rest parameter
```

次のようにキーワードパラメータが `**` だけであればエラーになりませんでした。
```ruby
def hoge(a, *, **)
  foo(*, **)
end
```




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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [ruby-dev:51202] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる
  2022-11-16  5:15 [ruby-dev:51196] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる tommy (Masahiro Tomita)
                   ` (4 preceding siblings ...)
  2022-11-17  8:52 ` [ruby-dev:51201] " shugo (Shugo Maeda)
@ 2022-11-17  9:09 ` yui-knk (Kaneko Yuichiro)
  5 siblings, 0 replies; 7+ messages in thread
From: yui-knk (Kaneko Yuichiro) @ 2022-11-17  9:09 UTC (permalink / raw)
  To: ruby-dev

Issue #19132 has been updated by yui-knk (Kaneko Yuichiro).


* UnboundMethod#parametersなどでは ** という変数名が見えている
* `DVAR@1:6-1:8 nil` で `**`を表現するよりは、`kwrest: (DVAR@1:6-1:8 :**)`で表現したほうが理解がしやすい

という点からRubyVM::AST側でも `**` が取得できるというふうに修正し test/ruby/test_ast.rb のexpectationを更新するのがよいと思います。

また調べたところ、議論になっているtest caseが追加されたのが https://github.com/ruby/ruby/commit/fa41a7b2608#diff-7db75141987f9cf709ba4cb68969d3bc97b0de8dfe175d845df2f3de2b91cae6R320 で、Add support for anonymous rest and keyword rest argument forwarding (https://github.com/ruby/ruby/commit/f53dfab95c3)のほうがあとであることもあり、expectationを更新することに前向きです。

anonymousでない場合:
 
```ruby
pp RubyVM::AbstractSyntaxTree.parse("def a(**a) end")

#=> (SCOPE@1:0-1:14
 tbl: []
 args: nil
 body:
   (DEFN@1:0-1:14
    mid: :a
    body:
      (SCOPE@1:0-1:14
       tbl: [:a]
       args:
         (ARGS@1:6-1:9
          pre_num: 0
          pre_init: nil
          opt: nil
          first_post: nil
          post_num: 0
          post_init: nil
          rest: nil
          kw: nil
          kwrest: (DVAR@1:6-1:9 :a)
          block: nil)
       body: nil)))
```

anonymousで、`**`を隠す場合:

```ruby
pp RubyVM::AbstractSyntaxTree.parse("def a(**) end")

#=> (SCOPE@1:0-1:13
 tbl: []
 args: nil
 body:
   (DEFN@1:0-1:13
    mid: :a
    body:
      (SCOPE@1:0-1:13
       tbl: [nil]
       args:
         (ARGS@1:6-1:8
          pre_num: 0
          pre_init: nil
          opt: nil
          first_post: nil
          post_num: 0
          post_init: nil
          rest: nil
          kw: nil
          kwrest: (DVAR@1:6-1:8 nil)
          block: nil)
       body: nil)))
```

anonymousで、`**`を隠さない場合:

```ruby
pp RubyVM::AbstractSyntaxTree.parse("def a(**) end")
#=> (SCOPE@1:0-1:13
 tbl: []
 args: nil
 body:
   (DEFN@1:0-1:13
    mid: :a
    body:
      (SCOPE@1:0-1:13
       tbl: [:**]
       args:
         (ARGS@1:6-1:8
          pre_num: 0
          pre_init: nil
          opt: nil
          first_post: nil
          post_num: 0
          post_init: nil
          rest: nil
          kw: nil
          kwrest: (DVAR@1:6-1:8 :**)
          block: nil)
       body: nil)))
```


----------------------------------------
Bug #19132: `**` を引数に指定すると no anonymous keyword rest parameter になる
https://bugs.ruby-lang.org/issues/19132#change-100149

* Author: tommy (Masahiro Tomita)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.0preview3 (2022-11-14) [arm64-darwin21]
* Backport: 2.7: DONTNEED, 3.0: DONTNEED, 3.1: DONTNEED
----------------------------------------
Ruby 3.2.0-preview3 で次のスクリプトを実行するとエラーになります。
```ruby
def hoge(a, *, k: nil, **)
  foo(*, **)
end
```

```
% ruby hoge.rb   
hoge.rb:2: no anonymous keyword rest parameter
```

次のようにキーワードパラメータが `**` だけであればエラーになりませんでした。
```ruby
def hoge(a, *, **)
  foo(*, **)
end
```




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

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-11-17  9:09 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-16  5:15 [ruby-dev:51196] [Ruby master Bug#19132] `**` を引数に指定すると no anonymous keyword rest parameter になる tommy (Masahiro Tomita)
2022-11-16 14:16 ` [ruby-dev:51197] " shugo (Shugo Maeda)
2022-11-16 23:03 ` [ruby-dev:51198] " shugo (Shugo Maeda)
2022-11-17  3:23 ` [ruby-dev:51199] " nobu (Nobuyoshi Nakada)
2022-11-17  3:32 ` [ruby-dev:51200] " shugo (Shugo Maeda)
2022-11-17  8:52 ` [ruby-dev:51201] " shugo (Shugo Maeda)
2022-11-17  9:09 ` [ruby-dev:51202] " yui-knk (Kaneko Yuichiro)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).