[#3587] Multiple assignment at yield() — Shin-ichro Hara <sinara@...>

原です。

86 messages 1998/11/17
[#3588] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/17

まつもと ゆきひろです

[#3589] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/17

原です。

[#3590] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/17

まつもと ゆきひろです

[#3594] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/18

原です。

[#3595] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/18

まつもと ゆきひろです

[#3596] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/18

原です。

[#3598] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/19

まつもと ゆきひろです

[#3600] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/20

原です。

[#3610] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/20

原です。

[#3611] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3622] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/21

原です。

[#3630] Re: Multiple assignment at yield() — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3635] Re: Multiple assignment at yield() — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3658] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/24

まつもと ゆきひろです

[#3660] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/24

原です。

[#3722] multiple assignment, yield and return — Shin-ichro Hara <sinara@...> 1998/12/01

原です。

[#3724] Re: multiple assignment, yield and return — Shin-ichro Hara <sinara@...> 1998/12/01

原です。

[#3742] List() — Shin-ichro Hara <sinara@...> 1998/12/04

原です。

[#3743] Re: List() — shugo@... (MAEDA Shugo) 1998/12/06

前田です。

[#3744] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/06

原です。

[#3755] Re: List() — shugo@... (MAEDA Shugo) 1998/12/07

前田です。

[#3758] Re: List() — Shin-ichro Hara <sinara@...> 1998/12/07

原です。

[#3760] Re: List() — shugo@... (MAEDA Shugo) 1998/12/07

前田です。

[#3761] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/07

原です。

[#3774] Re: List() — shugo@... (MAEDA Shugo) 1998/12/08

前田です。

[#3780] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/08

原です。

[#3784] Re: List() — shugo@... (MAEDA Shugo) 1998/12/09

前田です。

[#3788] Re: List() — Shin-ichro Hara <sinara@...> 1998/12/09

原です。

[#3789] Re: List() — MAEDA Shugo <shugo@...> 1998/12/10

前田です。

[#3602] problem of Delegator — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

17 messages 1998/11/20
[#3605] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3606] Re: problem of Delegator — keiju@... (石塚圭樹 ) 1998/11/20

けいじゅ@日本ラショナルソフトウェアです.

[#3607] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3612] Re: problem of Delegator — keiju@... (石塚圭樹 ) 1998/11/20

けいじゅ@日本ラショナルソフトウェアです.

[#3613] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3626] block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo)

前田です。

47 messages 1998/11/22
[#3628] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/22

新井です。

[#3629] Re: block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3632] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/22

新井です。

[#3633] Re: block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3636] Re: block local variable (Re: スコープの範囲) — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3642] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/23

新井です。

[#3645] Re: block local variable(Re: スコープの範囲) — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3674] Re: block local variable(Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/25

新井です。

[#3678] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3681] Re: block local variable(Re: スコープの範囲) — Kazuhiro HIWADA <hiwada@...> 1998/11/26

ひわだです。

[#3682] Re: block local variable(Re: スコープの範囲) — Shin-ichro Hara <sinara@...> 1998/11/26

原です。

[#3683] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3684] Re: block local variable(Re: スコープの範囲) — Shin-ichro Hara <sinara@...> 1998/11/26

原です。

[#3685] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3709] ruby-1.1c9 install 中に SEGV — Koji Arai <JCA02266@...>

新井です。

18 messages 1998/11/30

[ruby-dev:3627] Re: block local variable (Re: スコープの範囲)

From: shugo@... (MAEDA Shugo)
Date: 1998-11-22 10:20:10 UTC
List: ruby-dev #3627
前田です。

>>>>> In [ruby-dev:3626]
>>>>> "前田" == MAEDA Shugo <shugo@aianet.ne.jp> wrote:

前田> foo = 0
前田> iter {
前田>   foo ::= 1 # ブロックローカルになる。演算子はSatherから借用:-)
前田> }
前田> p foo #=> 0

前田> っていうのはどうでしょう。
前田> これだと名前の衝突を避けられるので、ブロックローカル変数の
前田> メリットが増すと思います。

試しにちょっと実装してみました。
演算子は:=にしました。
# Rubyは代入が=なので。


これで、

foo = 0
1.times {
  foo := 1
  p foo #=> 1
}
p foo #=> 0

となります。
:=ではなく=を使った場合の動作は従来通りです。

前田> 個人的にはfoo = 1とした時は、既にブロックローカルとしてfooが宣言されて
前田> ないかぎり、普通のローカル変数への代入とみなす方が便利な気もしますが。

こちらも実装は簡単そうですね。

問題はこの変更が望ましいかどうかですが。

-- 
前田 修吾 (mailto:shugo@aianet.ne.jp)

Attachments (1)

parse.y.diff (1.08 KB, text/x-diff)
--- parse.y.orig	Sun Nov 22 17:40:57 1998
+++ parse.y	Sun Nov 22 18:47:26 1998
@@ -201,6 +201,7 @@
 %token tCOLON2		/* :: */
 %token tCOLON3		/* :: at EXPR_BEG */
 %token <id> tOP_ASGN	/* +=, -=  etc. */
+%token tDYNA_ASGN	/* := */
 %token tASSOC		/* => */
 %token tLPAREN		/* ( */
 %token tLBRACK		/* [ */
@@ -217,7 +218,7 @@
 %left  kOR kAND
 %right kNOT
 %nonassoc kDEFINED
-%right '=' tOP_ASGN
+%right '=' tOP_ASGN tDYNA_ASGN
 %right '?' ':'
 %nonassoc tDOT2 tDOT3
 %left  tOROP
@@ -619,6 +620,16 @@
 			}
 			fixpos($$, $3);
 		    }
+		| tIDENTIFIER tDYNA_ASGN arg
+		    {
+			if (!dyna_in_block())
+			    yyerror("Can't declare block local variable here");
+			if (!dyna_var_defined($1)) {
+			    dyna_var_asgn($1, TRUE);
+			}
+			$$ = assignable($1, $3);
+			fixpos($$, $3);
+		    }
 		| primary '[' aref_args ']' tOP_ASGN arg
 		    {
 			NODE *args = NEW_LIST($6);
@@ -2761,6 +2772,10 @@
 	    }
 	    lex_state = EXPR_DOT;
 	    return tCOLON2;
+	}
+	else if (c == '=') {
+	    lex_state = EXPR_BEG;
+	    return tDYNA_ASGN;
 	}
 	pushback(c);
 	if (lex_state == EXPR_END || ISSPACE(c)) {

In This Thread