[#29374] nil.to_s — Shugo Maeda <shugo@...>

前田です。

59 messages 2006/09/01
[#29375] Re: nil.to_s — "U.Nakamura" <usa@...> 2006/09/01

こんにちは、なかむら(う)です。

[#29380] Re: nil.to_s — Yukihiro Matsumoto <matz@...> 2006/09/01

まつもと ゆきひろです

[#29387] Re: nil.to_s — Shugo Maeda <shugo@...> 2006/09/01

前田です。

[#29390] Re: nil.to_s — Yukihiro Matsumoto <matz@...> 2006/09/01

まつもと ゆきひろです

[#29398] Re: nil.to_s — "NARUSE, Yui" <naruse@...> 2006/09/01

成瀬です。

[#29400] Re: nil.to_s — Yukihiro Matsumoto <matz@...> 2006/09/01

まつもと ゆきひろです

[#29491] symbol and string — Tanaka Akira <akr@...>

open-uri で :proxy=>nil という指定を行うと、以下のようにエラーになります。

33 messages 2006/09/05
[#29499] Re: symbol and string — Yukihiro Matsumoto <matz@...> 2006/09/05

まつもと ゆきひろです

[#29500] Re: symbol and string — Tanaka Akira <akr@...> 2006/09/05

In article <1157470154.047826.13379.nullmailer@x31.priv.netlab.jp>,

[#29503] Re: symbol and string — Yukihiro Matsumoto <matz@...> 2006/09/06

まつもと ゆきひろです

[#29504] Re: symbol and string — Tanaka Akira <akr@...> 2006/09/06

In article <1157505538.340126.8472.nullmailer@x31.priv.netlab.jp>,

[#29507] Re: symbol and string — Yukihiro Matsumoto <matz@...> 2006/09/06

まつもと ゆきひろです

[#29512] Re: symbol and string — keiju@... (石塚圭樹) 2006/09/06

けいじゅ@いしつかです.

[#29529] Re: symbol and string — SASADA Koichi <ko1@...> 2006/09/08

 ささだです。

[#29530] Re: symbol and string — Yukihiro Matsumoto <matz@...> 2006/09/08

まつもと ゆきひろです

[ruby-dev:29567] variable after when

From: Nobuyoshi Nakada <nobu@...>
Date: 2006-09-13 00:23:03 UTC
List: ruby-dev #29567
なかだです。

以前ちょっと提案した覚えがありますが、rescue同様whenの比較結果
を変数に代入する構文はどうでしょうか。Regexp#===の戻り値も
MatchDataにすることで、$~を使う必要を減らせると思います。


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.945
diff -p -u -2 -r1.945 eval.c
--- eval.c	10 Sep 2006 00:18:18 -0000	1.945
+++ eval.c	12 Sep 2006 23:53:08 -0000
@@ -2686,14 +2686,15 @@ unknown_node(NODE *volatile node)
 
 static int
-when_cond(VALUE v1, VALUE v2)
+when_cond(VALUE v1, VALUE v2, volatile VALUE *result)
 {
-    if (v1 == Qundef) {
-	return RTEST(v2);
+    if (v1 != Qundef) {
+	v2 = rb_funcall2(v2, eqq, 1, &v1);
     }
-    return RTEST(rb_funcall2(v2, eqq, 1, &v1));
+    *result = v2;
+    return RTEST(v2);
 }
 
 static int
-when_check(NODE *tag, VALUE val, VALUE self)
+when_check(NODE *tag, VALUE val, VALUE self, volatile VALUE *result)
 {
     VALUE elm;
@@ -2704,5 +2705,5 @@ when_check(NODE *tag, VALUE val, VALUE s
 	while (tag) {
 	    elm = rb_eval(self, tag->nd_head);
-	    if (when_cond(val, elm)) {
+	    if (when_cond(val, elm, result)) {
 		return Qtrue;
 	    }
@@ -2713,5 +2714,5 @@ when_check(NODE *tag, VALUE val, VALUE s
 	elm = svalue_to_avalue(rb_eval(self, tag->nd_head));
 	for (i=0; i<RARRAY_LEN(elm); i++) {
-	    if (when_cond(val, RARRAY_PTR(elm)[i])) {
+	    if (when_cond(val, RARRAY_PTR(elm)[i], result)) {
 		return Qtrue;
 	    }
@@ -2719,11 +2720,11 @@ when_check(NODE *tag, VALUE val, VALUE s
 	break;
       case NODE_ARGSCAT:
-	if (when_check(tag->nd_head, val, self)) return Qtrue;
-	return when_check(tag->nd_body, val, self);
+	if (when_check(tag->nd_head, val, self, result)) return Qtrue;
+	return when_check(tag->nd_body, val, self, result);
       case NODE_ARGSPUSH:
-	if (when_check(tag->nd_head, val, self)) return Qtrue;
-	if (when_cond(val, rb_eval(self, tag->nd_body))) return Qtrue;
+	if (when_check(tag->nd_head, val, self, result)) return Qtrue;
+	if (when_cond(val, rb_eval(self, tag->nd_body), result)) return Qtrue;
       default:
-	if (when_cond(val, rb_eval(self, tag))) return Qtrue;
+	if (when_cond(val, rb_eval(self, tag), result)) return Qtrue;
 	break;
     }
@@ -2874,5 +2875,8 @@ rb_eval(VALUE self, NODE *n)
 				ruby_frame->this_func,
 				ruby_frame->this_class);
-		if (when_check(node->nd_head, val, self)) {
+		if (when_check(node->nd_head->nd_cond, val, self, &result)) {
+		    if (node->nd_head->nd_body) {
+			assign(self, node->nd_head->nd_body, result, Qfalse);
+		    }
 		    node = node->nd_body;
 		    goto again;
Index: parse.y
===================================================================
RCS file: /cvs/ruby/src/ruby/parse.y,v
retrieving revision 1.458
diff -p -u -2 -r1.458 parse.y
--- parse.y	6 Sep 2006 04:25:53 -0000	1.458
+++ parse.y	12 Sep 2006 23:44:31 -0000
@@ -3392,12 +3392,12 @@ brace_block	: '{'
 		;
 
-case_body	: keyword_when args then
+case_body	: keyword_when args exc_var then
 		  compstmt
 		  cases
 		    {
 		    /*%%%*/
-			$$ = NEW_WHEN($2, $4, $5);
+			$$ = NEW_WHEN(NEW_IF($2, $3, 0), $5, $6);
 		    /*%
-			$$ = dispatch3(when, $2, $4, escape_Qundef($5));
+			$$ = dispatch4(when, $2, $3, $5, escape_Qundef($6));
 		    %*/
 		    }
Index: re.c
===================================================================
RCS file: /cvs/ruby/src/ruby/re.c,v
retrieving revision 1.154
diff -p -U 2 -r1.154 re.c
--- re.c	31 Aug 2006 10:47:43 -0000	1.154
+++ re.c	12 Sep 2006 23:57:05 -0000
@@ -1658,7 +1658,7 @@ rb_reg_eqq(VALUE re, VALUE str)
     start = rb_reg_search(re, str, 0, 0);
     if (start < 0) {
-	return Qfalse;
+	return Qnil;
     }
-    return Qtrue;
+    return rb_backref_get();
 }
 


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next