From 6c0cc67bb22435d3c8233777258fe917f72c842a Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 2 Mar 2005 03:21:31 +0000 Subject: * eval.c (rb_eval): [EXPERIMENTAL] NODE_LAMBDA implemented. [ruby-dev:25780] * node.h (NODE_LAMBDA): for literal Proc object. * parse.y (expr): interpret mere do...end block as proc object. * parse.y (primary): ditto, for brace block. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8044 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 11 +++++++++++ eval.c | 5 +++++ node.h | 2 ++ parse.y | 37 ++++++++++++++++++++++++++++++++++--- 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d9ae088866..056a4506e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Wed Mar 2 12:21:18 2005 Nobuyoshi Nakada + + * eval.c (rb_eval): [EXPERIMENTAL] NODE_LAMBDA implemented. + [ruby-dev:25780] + + * node.h (NODE_LAMBDA): for literal Proc object. + + * parse.y (expr): interpret mere do...end block as proc object. + + * parse.y (primary): ditto, for brace block. + Tue Mar 1 21:16:54 2005 K.Kosako * regcomp.c (optimize_node_left): uninitialized member diff --git a/eval.c b/eval.c index 860ec0ab12..fae1ffce7d 100644 --- a/eval.c +++ b/eval.c @@ -2941,6 +2941,7 @@ rb_eval(self, n) case NODE_ITER: case NODE_FOR: + case NODE_LAMBDA: { PUSH_TAG(PROT_LOOP); PUSH_BLOCK(node->nd_var, node->nd_body); @@ -2952,6 +2953,10 @@ rb_eval(self, n) if (nd_type(node) == NODE_ITER) { result = rb_eval(self, node->nd_iter); } + else if (nd_type(node) == NODE_LAMBDA) { + ruby_iter->iter = ruby_frame->iter = ITER_CUR; + result = rb_block_proc(); + } else { VALUE recv; diff --git a/node.h b/node.h index 13b0279f3e..6a0bb09e12 100644 --- a/node.h +++ b/node.h @@ -125,6 +125,7 @@ enum node_type { NODE_DSYM, NODE_ATTRASGN, NODE_PRELUDE, + NODE_LAMBDA, NODE_LAST }; @@ -340,6 +341,7 @@ typedef struct RNode { #define NEW_BMETHOD(b) NEW_NODE(NODE_BMETHOD,0,0,b) #define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a) #define NEW_PRELUDE(p,b) NEW_NODE(NODE_PRELUDE,p,b,0) +#define NEW_LAMBDA(v,b) NEW_NODE(NODE_LAMBDA,v,b,0) #define NOEX_PUBLIC 0 #define NOEX_NOSUPER 1 diff --git a/parse.y b/parse.y index 3606060e1c..ac1668f7e5 100644 --- a/parse.y +++ b/parse.y @@ -489,7 +489,7 @@ static void ripper_compile_error _((struct parser_params*, const char *fmt, ...) %type mrhs superclass block_call block_command %type f_arglist f_args f_optarg f_opt f_block_arg opt_f_block_arg %type assoc_list assocs assoc undef_list backref string_dvar -%type for_var block_var opt_block_var block_par +%type for_var block_var opt_block_var block_var_def block_par %type brace_block cmd_brace_block do_block lhs none fitem %type mlhs mlhs_head mlhs_basic mlhs_entry mlhs_item mlhs_node %type fsym variable sym symbol operation operation2 operation3 @@ -1014,6 +1014,11 @@ expr : command_call $$ = dispatch2(unary, ID2SYM('!'), $2); %*/ } + | do_block + { + $$ = $1; + nd_set_type($$, NODE_LAMBDA); + } | arg ; @@ -2504,6 +2509,26 @@ primary : literal $$ = dispatch1(hash, escape_Qundef($2)); %*/ } + | tLBRACE + { + /*%%%*/ + $$ = dyna_push(); + $1 = ruby_sourceline; + /*% + %*/ + } + block_var_def {$$ = ruby_dyna_vars;} + compstmt + '}' + { + /*%%%*/ + $$ = NEW_LAMBDA($3, dyna_init($5, $4)); + nd_set_line($$, $1); + dyna_pop($2); + /*% + $$ = dispatch2(brace_block, escape_Qundef($3), $5); + %*/ + } | kRETURN { /*%%%*/ @@ -3062,7 +3087,13 @@ block_var : block_par ; opt_block_var : none - | '|' /* none */ '|' + | block_var_def + { + $$ = $1; + } + ; + +block_var_def : '|' /* none */ '|' { /*%%%*/ $$ = (NODE*)1; @@ -6380,7 +6411,7 @@ parser_yylex(parser) if (COND_P()) return kDO_COND; if (CMDARG_P() && state != EXPR_CMDARG) return kDO_BLOCK; - if (state == EXPR_ENDARG) + if (state == EXPR_ENDARG || state == EXPR_BEG) return kDO_BLOCK; return kDO; } -- cgit v1.2.3