豊福です。
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);