From: ts Date: 2000-10-16T20:42:28+09:00 Subject: [ruby-talk:5584] Re: local variables (nested, in-block, parameters, etc.) >>>>> "Y" == Yukihiro Matsumoto writes: Y> Dave's idea in [ruby-talk:5546] (i.e. lambda{ ...}) is Y> interesting. It'll make Ruby slightly more complex, but solves problem ^^^^^^^^^^^^^^^^^^^^^ Y> 1 above without incompatibility. If no one find the problem for this, Y> I think I'm going to implement this in 1.7. Perhaps (and certainly :-)) I'm stupid but why it make ruby more complex ? What I'm missing ? pigeon% cat b.rb #!./ruby a = 12 p "LOCAL #{a}" proc = lambda do p "INTERN #{a}" [1, 2].each do p "BEFORE #{a}" [3, 4].each do p "IN #{a}" end p "AFTER #{a}" end p "INTERN #{a}" end proc.call(24) p "LOCAL #{a}" pigeon% pigeon% b.rb "LOCAL 12" "INTERN 24" "BEFORE 1" "IN 3" "IN 4" "AFTER 1" "BEFORE 2" "IN 3" "IN 4" "AFTER 2" "INTERN 24" "LOCAL 12" pigeon% pigeon% diff -u ../ruby/parse.y parse.y --- ../ruby/parse.y Mon Oct 16 13:23:37 2000 +++ parse.y Mon Oct 16 13:30:54 2000 @@ -73,6 +73,7 @@ static int in_single = 0; static int compile_for_eval = 0; static ID cur_mid = 0; +static int ruby_declare_dyna = 0; static NODE *cond(); static NODE *logop(); @@ -1348,6 +1349,18 @@ { $$ = $2; } + | '<' + { + $$ = dyna_push(); + ruby_declare_dyna++; + } + block_var '>' + { + ruby_declare_dyna--; + dyna_pop($2); + $$ = $3; + } + do_block : kDO @@ -4035,6 +4048,10 @@ else if (rb_dvar_defined(id)) { return NEW_DASGN(id, val); } + else if (ruby_declare_dyna) { + rb_dvar_push(id, Qnil); + return NEW_DASGN_CURR(id, val); + } else if (local_id(id) || !dyna_in_block()) { return NEW_LASGN(id, val); } pigeon% Guy Decoux