[#12387] reducing logical operation — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

17 messages 2001/03/07
[#12388] Re: reducing logical operation — EGUCHI Osamu <eguchi@...> 2001/03/07

えぐち@エスアンドイー です。

[#12389] Re: reducing logical operation — nobu.nakada@... 2001/03/07

なかだです。

[#12391] Re: reducing logical operation — EGUCHI Osamu <eguchi@...> 2001/03/07

えぐち@エスアンドイー です。

[#12404] fork in threads — keiju@... (Keiju ISHITSUKA)

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

14 messages 2001/03/09

[#12405] at_exit — keiju@... (Keiju ISHITSUKA)

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

15 messages 2001/03/09
[#12409] Re: at_exit — matz@... (Yukihiro Matsumoto) 2001/03/10

まつもと ゆきひろです

[#12411] Re: at_exit — keiju@... (石塚圭樹) 2001/03/10

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

[#12425] bignum % の結果が負数になることがある — Hisayasu Nakao <h-nakao@...>

最近、ruby-1.6.2を使い出したばかりの中尾です。

39 messages 2001/03/12
[#12427] Re: bignum % の結果が負数になることがある — WATANABE Hirofumi <eban@...> 2001/03/12

わたなべです。

[#12463] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/13

In message <4518-Mon12Mar2001145434+0900-eban@os.rim.or.jp>

[#12464] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/13

まつもと ゆきひろです

[#12466] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/13

In message <984469222.234203.1007.nullmailer@ev.netlab.zetabits.com>

[#12475] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12476] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984550885.417146.3670.nullmailer@ev.netlab.zetabits.com>

[#12480] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12481] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984553493.009507.3747.nullmailer@ev.netlab.zetabits.com>

[#12488] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12493] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984579430.080967.5569.nullmailer@ev.netlab.zetabits.com>

[#12578] require 'win32api' — Kazuhiro NISHIYAMA <zn@...>

require 'win32api'のエラーメッセージがわかりにくいと

21 messages 2001/03/20
[#12579] Re: require 'win32api' — nobu.nakada@... 2001/03/20

なかだです。

[#12598] Re: require 'win32api' — nobu.nakada@... 2001/03/21

なかだです。

[#12582] finalizer problem — keiju@... (Keiju ISHITSUKA)

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

20 messages 2001/03/20
[#12583] Re: finalizer problem — matz@... (Yukihiro Matsumoto) 2001/03/20

まつもと ゆきひろです

[#12585] Re: finalizer problem — keiju@... (石塚圭樹) 2001/03/20

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

[#12591] Re: finalizer problem — matz@... (Yukihiro Matsumoto) 2001/03/20

まつもと ゆきひろです

[#12619] Re: finalizer problem — keiju@... (石塚圭樹) 2001/03/22

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

[#12605] extern inline (ruby.h) ruby-1.6.3 — WATANABE Tetsuya <tetsu@...>

渡辺哲也です。

17 messages 2001/03/22
[#12606] Re: extern inline (ruby.h) ruby-1.6.3 — matz@... (Yukihiro Matsumoto) 2001/03/22

まつもと ゆきひろです

[#12607] Re: extern inline (ruby.h) ruby-1.6.3 — WATANABE Tetsuya <tetsu@...> 2001/03/22

渡辺哲也です。

[#12608] Re: extern inline (ruby.h) ruby-1.6.3 — matz@... (Yukihiro Matsumoto) 2001/03/22

まつもと ゆきひろです

[#12674] Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp>

21 messages 2001/03/25
[#12675] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/26

まつもと ゆきひろです

[#12678] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/26

[#12681] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/26

まつもと ゆきひろです

[#12687] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/27

[#12688] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/28

まつもと ゆきひろです

[#12710] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/31

[ruby-dev:12338] Re: [ruby-list:28364] class definition extension

From: "K.Kosako" <kosako@...>
Date: 2001-03-02 00:00:09 UTC
List: ruby-dev #12338
GOTO Kentaroさんの
<200103010709.QAA05044@hanare00.math.sci.hokudai.ac.jp>から
> >いや、だめじゃないと思いますよ。小迫さんがあれだけ苦労してい
> >るのを見てると、けっきょく今やろうとしている文法の曖昧性が高
> >すぎるということを意味してるんだと思います。となると、別の文
> >法マーク(<< や ( ) のような)を導入した方が人間にも優しいのか
> >もしれませんね。
> 
> そうかも知れませんね。ぼくは ( ) 必須でも悪くないと思います。
> 目立つので注目できるという効果もありそうですし。

そうですね。
前回の方法は、面白いと思うんですが、
やっぱりやり過ぎでした。

式全体を()で括ることにして、実装してみました。
他の候補としては、良いかどうかは別として、
[]で括る方法でもconflictはありませんでした。

NODEの種類を追加してしまいました。
新規NODEの追加は、出来る限り避けたかったことなのですが、
他の方法は少し汚いので仕方ないようですね。
結局、中田さんのとほとんど同じです。

この機能、他のオブジェクト指向言語にありますか?
(この機能というより、クラスを何度も定義できること自体が
希少なのかな?)

昨日は定期健康診断だったので一日空いてしまいましたが、
皆さんの意見が聞けたので、ちょうどよかったです。

使用例
$a = String
class ($a); p(self == ::Object::String); end
class ((1 < 2).type); p self; end

module M; end
m = Array[M]
module (m[0])
  def bar; p self; end
end


--- node.h	Wed Feb 14 14:51:57 2001
+++ /home/kosako/ruby/node.h	Fri Mar  2 07:44:59 2001
@@ -99,6 +99,8 @@
     NODE_CLASS,
     NODE_MODULE,
     NODE_SCLASS,
+    NODE_OCLASS,
+    NODE_OMODULE,
     NODE_COLON2,
     NODE_COLON3,
     NODE_CREF,
@@ -311,7 +313,9 @@
 #define NEW_UNDEF(i) rb_node_newnode(NODE_UNDEF,0,i,0)
 #define NEW_CLASS(n,b,s) rb_node_newnode(NODE_CLASS,n,NEW_CBODY(b),(s))
 #define NEW_SCLASS(r,b) rb_node_newnode(NODE_SCLASS,r,NEW_CBODY(b),0)
+#define NEW_OCLASS(c,b,s) rb_node_newnode(NODE_OCLASS,c,NEW_CBODY(b),(s))
 #define NEW_MODULE(n,b) rb_node_newnode(NODE_MODULE,n,NEW_CBODY(b),0)
+#define NEW_OMODULE(m,b) rb_node_newnode(NODE_OMODULE,m,NEW_CBODY(b),0)
 #define NEW_COLON2(c,i) rb_node_newnode(NODE_COLON2,c,i,0)
 #define NEW_COLON3(i) rb_node_newnode(NODE_COLON3,0,i,0)
 #define NEW_CREF0() (cur_cref=RNODE(ruby_frame->cbase))

--- lex.c	Tue May 30 13:24:01 2000
+++ /home/kosako/ruby/lex.c	Fri Mar  2 06:42:58 2001
@@ -76,7 +76,7 @@
       {"else", kELSE, kELSE, EXPR_BEG},
       {"case", kCASE, kCASE, EXPR_BEG},
       {"ensure", kENSURE, kENSURE, EXPR_BEG},
-      {"module", kMODULE, kMODULE, EXPR_BEG},
+      {"module", kMODULE, kMODULE, EXPR_CLASS},
       {"elsif", kELSIF, kELSIF, EXPR_BEG},
       {"def", kDEF, kDEF, EXPR_FNAME},
       {"rescue", kRESCUE, kRESCUE_MOD, EXPR_END},

--- parse.y	Mon Feb 26 14:29:00 2001
+++ /home/kosako/ruby/parse.y	Fri Mar  2 07:30:25 2001
@@ -200,7 +200,7 @@
 %token <val>  tINTEGER tFLOAT tSTRING tXSTRING tREGEXP
 %token <node> tDSTRING tDXSTRING tDREGEXP tNTH_REF tBACK_REF
 
-%type <node> singleton string
+%type <node> singleton string cmobj
 %type <val>  literal numeric
 %type <node> compstmt stmts stmt expr arg primary command command_call method_call
 %type <node> if_tail opt_else case_body cases rescue exc_list exc_var ensure
@@ -1271,6 +1271,24 @@
 			cref_pop();
 			class_nest--;
 		    }
+		| kCLASS cmobj
+		    {
+			if (in_def || in_single)
+			    yyerror("class definition in method body");
+			class_nest++;
+			cref_push();
+			local_push();
+		        $<num>$ = ruby_sourceline;
+		    }
+		  compstmt
+		  kEND
+		    {
+		        $$ = NEW_OCLASS($2, $4, 0);
+		        nd_set_line($$, $<num>3);
+		        local_pop();
+			cref_pop();
+			class_nest--;
+		    }
 		| kCLASS tLSHFT expr
 		    {
 			$<num>$ = in_def;
@@ -1313,6 +1331,24 @@
 			cref_pop();
 			class_nest--;
 		    }
+		| kMODULE cmobj
+		    {
+			if (in_def || in_single)
+			    yyerror("module definition in method body");
+			class_nest++;
+			cref_push();
+			local_push();
+		        $<num>$ = ruby_sourceline;
+		    }
+		  compstmt
+		  kEND
+		    {
+		        $$ = NEW_OMODULE($2, $4);
+		        nd_set_line($$, $<num>3);
+		        local_pop();
+			cref_pop();
+			class_nest--;
+		    }
 		| kDEF fname
 		    {
 			if (in_def || in_single)
@@ -1773,6 +1809,24 @@
 			$$ = $2;
 		    }
 		| none
+
+cmobj		: '(' {lex_state = EXPR_BEG;} expr opt_nl ')'
+		    {
+			switch (nd_type($3)) {
+			  case NODE_STR:
+			  case NODE_DSTR:
+			  case NODE_XSTR:
+			  case NODE_DXSTR:
+			  case NODE_DREGX:
+			  case NODE_LIT:
+			  case NODE_ARRAY:
+			  case NODE_ZARRAY:
+			    yyerror("can't define class/module for literals.");
+			  default:
+			    break;
+			}
+			$$ = $3;
+		    }
 
 singleton	: var_ref
 		    {

--- eval.c	Wed Feb 28 15:30:03 2001
+++ /home/kosako/ruby/eval.c	Fri Mar  2 08:01:56 2001
@@ -3104,6 +3104,32 @@
 	}
 	break;
 
+      case NODE_OCLASS:
+	{
+	    VALUE klass;
+
+	    if (NIL_P(ruby_class)) {
+		rb_raise(rb_eTypeError, "no outer class/module");
+	    }
+
+	    klass = rb_eval(self, (NODE* )node->nd_cname);
+	    if (!klass || TYPE(klass) != T_CLASS) {
+		rb_raise(rb_eTypeError, "class definition target is not a class");
+	    }
+	    if (rb_safe_level() >= 4) {
+	      rb_raise(rb_eSecurityError, "extending class prohibited");
+	    }
+	    rb_clear_cache();
+
+	    if (ruby_wrapper) {
+		rb_extend_object(klass, ruby_wrapper);
+		rb_include_module(klass, ruby_wrapper);
+	    }
+
+	    result = module_setup(klass, node->nd_body);
+	}
+	break;
+
       case NODE_MODULE:
 	{
 	    VALUE module;
@@ -3131,6 +3157,30 @@
 		module = rb_define_module_id(node->nd_cname);
 		rb_const_set(ruby_class, node->nd_cname, module);
 		rb_set_class_path(module,ruby_class,rb_id2name(node->nd_cname));
+	    }
+	    if (ruby_wrapper) {
+		rb_extend_object(module, ruby_wrapper);
+		rb_include_module(module, ruby_wrapper);
+	    }
+
+	    result = module_setup(module, node->nd_body);
+	}
+	break;
+
+      case NODE_OMODULE:
+	{
+	    VALUE module;
+
+	    if (NIL_P(ruby_class)) {
+		rb_raise(rb_eTypeError, "no outer class/module");
+	    }
+
+	    module = rb_eval(self, (NODE* )node->nd_cname);
+	    if (!module || TYPE(module) != T_MODULE) {
+		rb_raise(rb_eTypeError, "module definition target is not a module");
+	    }
+	    if (rb_safe_level() >= 4) {
+	      rb_raise(rb_eSecurityError, "extending module prohibited");
 	    }
 	    if (ruby_wrapper) {
 		rb_extend_object(module, ruby_wrapper);
----
小迫@ソフネック   渋谷区恵比寿1-15-1

In This Thread