[#8824] [REQ] Integer#{hex,dec,oct,bin}, String#bin — gotoken@... (GOTO Kentaro)

ごとけんです

38 messages 2000/01/05
[#8839] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — matz@... (Yukihiro Matsumoto) 2000/01/06

まつもと ゆきひろです

[#8842] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — gotoken@... (GOTO Kentaro) 2000/01/06

ごとけんです

[#8843] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — matz@... (Yukihiro Matsumoto) 2000/01/06

まつもと ゆきひろです

[#8844] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — gotoken@... (GOTO Kentaro) 2000/01/06

ごとけんです

[#8846] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — matz@... (Yukihiro Matsumoto) 2000/01/06

まつもと ゆきひろです

[#8847] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — gotoken@... (GOTO Kentaro) 2000/01/06

ごとけんです

[#8893] Re: [ruby-list:20142] Re: Range expansion? — Akinori MUSHA aka knu <knu@...>

 knuです。ruby-listから舞台を移しました。

13 messages 2000/01/09

[#8980] 1.4.3 patch for near-future *BSD IPv6 support — Jun-ichiro itojun Hagino <itojun@...>

近い将来の{Net,Free,Open}BSDにはKAME IPv6 stackが統合されています。

17 messages 2000/01/20
[#8981] Re: 1.4.3 patch for near-future *BSD IPv6 support — Jun-ichiro itojun Hagino <itojun@...> 2000/01/20

> それから、

[ruby-dev:8906] Re: [ruby-list:20142] Re: Range expansion?

From: Shugo Maeda <shugo@...>
Date: 2000-01-11 09:33:28 UTC
List: ruby-dev #8906
前田です。

At Mon, 10 Jan 2000 04:16:37 +0900,
Akinori MUSHA aka knu <knu@idaemons.org> wrote:
> > 	knu@archon[2]% ruby -e 'a = "a b c d".split; p a; a[*[1,2]] = []; p a'
> > 	["a", "b", "c", "d"]
> > 	["a", 2, "c", "d"]
> > 
> > というのはどういうことでしょうか。(あとで自分でも見てみます)
> 
> も自分で原因を突き止めて修正できるんですが。。
> 
> # とりあえず、引数を渡すスタックが一つずれて a[1] = 2 が実行されて
> # しまうことは分かります。array.c#rb_ary_aset()をトレースすると
> # 引数は二個しか来ていないみたいだし。。

原因はもう少し複雑で、

a[x] = y

という式があった時に最終的にrb_ary_concat(x, y)がよばれてしまうせ
いです。
# x == [1, 2], y == [] だと、[1, 2] + [] => [1, 2]になってしまう。

以下のパッチでよいのではないかと思うのですが、どうでしょう。

--- parse.y.orig        Tue Jan 11 18:20:41 2000
+++ parse.y     Tue Jan 11 18:21:37 2000
@@ -3775,12 +3775,14 @@
     NODE *node1;
     NODE *node2;
 {
-    if (!node1) return NEW_LIST(node2);
+    NODE *list = NEW_LIST(node2);
+
+    if (!node1) return list;
     if (nd_type(node1) == NODE_ARRAY) {
-       return list_append(node1, node2);
+       return list_append(node1, list);
     }
     else {
-       return NEW_ARGSCAT(node1, node2);
+       return NEW_ARGSCAT(node1, list);
     }
 }
 
-- 
前田 修吾

In This Thread