From: toyofuku@... Date: 1999-10-27T22:54:05+09:00 Subject: [ruby-list:18044] formal argument instance variable 豊福です。 def foo(@x, @y = 0) のように仮引数のところにインス タンス変数を使えるようにするパッチです。 といってもちょっとやってみたというレベルで、 def Bar.foo(@x, ...) の方もまだ入れてません。 (採用されないなら無駄骨になるから (^_^;) def foo(@x, @y = 0) を def foo(_@x, _@y = 0) @x = _@x @y = _@y に対応させるという泥くさい方法なのでダメかな。 --- 豊福 toyofuku@juice.or.jp *** parse.y.org Fri Sep 17 01:11:25 1999 --- parse.y Wed Oct 27 22:19:34 1999 *************** *** 61,66 **** --- 61,70 ---- static int compile_for_eval = 0; static ID cur_mid = 0; + static ID ivarg_id[64]; + static ID tvarg_id[64]; + static int n_ivarg; + static NODE *cond(); static NODE *logop(); *************** *** 1179,1184 **** --- 1183,1189 ---- yyerror("nested method definition"); cur_mid = $2; local_push(); + n_ivarg = 0; } f_arglist compstmt *************** *** 1185,1190 **** --- 1190,1200 ---- kEND { /* NOEX_PRIVATE for toplevel */ + if (n_ivarg) { + while (--n_ivarg >= 0) { + $5 = block_append(newline_node(NEW_IASGN(ivarg_id[n_ivarg], NEW_LVAR(tvarg_id[n_ivarg]))), $5); + } + } $$ = NEW_DEFN($2, $4, $5, class_nest?0:1); fixpos($$, $4); local_pop(); *************** *** 1525,1531 **** --- 1535,1554 ---- local_cnt($1); $$ = 1; } + | tIVAR + { + ID id; + char buf[64]; + sprintf(buf, "_%s", rb_id2name($1)); + id = rb_intern(buf); + local_cnt(id); + ivarg_id[n_ivarg] = $1; + tvarg_id[n_ivarg] = id; + n_ivarg++; + $$ = 1; + } + f_arg : f_norm_arg | f_arg ',' f_norm_arg { *************** *** 1540,1546 **** --- 1563,1582 ---- yyerror("duplicate optional argument name"); $$ = assignable($1, $3); } + | tIVAR '=' arg + { + ID id; + char buf[32]; + sprintf(buf, "_%s", rb_id2name($1)); + id = rb_intern(buf); + local_cnt(id); + ivarg_id[n_ivarg] = $1; + tvarg_id[n_ivarg] = id; + n_ivarg++; + $$ = assignable(id, $3); + } + f_optarg : f_opt { $$ = NEW_BLOCK($1);