豊福@パパイヤです。

私
>   +!, -!, *!, /! みたいなのに alias できて演算子として
> 使えればいいんですがダメですかね。

  "+!other" は "+! other" と "+ !other" で ambiguous
でまずいかとも思ったんですが、
"foo.bar!other" は "foo.bar!(other)" と解釈されるんで、
"+!" もいいかと parse.y をいじってみました。

  採用されないような気がするので全演算をいじるのは
やめて "+!" と "*!" だけにしました。

*** parse.y.orig	Mon Feb  9 19:56:33 1998
--- parse.y	Tue Mar 17 09:43:56 1998
***************
*** 199,204 ****
--- 199,206 ----
  %token LBRACK           /* [ */
  %token LBRACE           /* { */
  %token STAR             /* * */
+ %token APLUS            /* +! */
+ %token AMULT            /* *! */
  %token SYMBEG
  
  /*
***************
*** 219,226 ****
  %left  '|' '^'
  %left  '&'
  %left  LSHFT RSHFT
! %left  '+' '-'
! %left  '*' '/' '%'
  %right '!' '~' UPLUS UMINUS
  %right POW
  
--- 221,228 ----
  %left  '|' '^'
  %left  '&'
  %left  LSHFT RSHFT
! %left  '+' '-' APLUS
! %left  '*' '/' '%' AMULT
  %right '!' '~' UPLUS UMINUS
  %right POW
  
***************
*** 506,513 ****
--- 508,517 ----
  		| LSHFT		{ $$ = LSHFT; }
  		| RSHFT		{ $$ = RSHFT; }
  		| '+'		{ $$ = '+'; }
+ 		| APLUS		{ $$ = APLUS; }
  		| '-'		{ $$ = '-'; }
  		| '*'		{ $$ = '*'; }
+ 		| AMULT		{ $$ = AMULT; }
  		| STAR		{ $$ = '*'; }
  		| '/'		{ $$ = '/'; }
  		| '%'		{ $$ = '%'; }
***************
*** 585,590 ****
--- 589,598 ----
  		    {
  			$$ = call_op($1, '+', 1, $3);
  		    }
+ 		| arg APLUS arg
+ 		    {
+ 			$$ = call_op($1, APLUS, 1, $3);
+ 		    }
  		| arg '-' arg
  		    {
  		        $$ = call_op($1, '-', 1, $3);
***************
*** 593,598 ****
--- 601,610 ----
  		    {
  		        $$ = call_op($1, '*', 1, $3);
  		    }
+ 		| arg AMULT arg
+ 		    {
+ 			$$ = call_op($1, AMULT, 1, $3);
+ 		    }
  		| arg '/' arg
  		    {
  			$$ = call_op($1, '/', 1, $3);
***************
*** 2188,2193 ****
--- 2200,2209 ----
  	    lex_state = EXPR_BEG;
  	    return OP_ASGN;
  	}
+ 	else if (c == '!') {
+ 	    lex_state = EXPR_BEG;
+ 	    return AMULT;
+ 	}
  	pushback(c);
  	if (lex_state == EXPR_ARG && space_seen && !isspace(c)){
  	    arg_ambiguous();
***************
*** 2362,2367 ****
--- 2378,2386 ----
  	    if (c == '@') {
  		return UPLUS;
  	    }
+ 	    else if (c == '!') {
+ 		return APLUS;
+ 	    }
  	    pushback(c);
  	    return '+';
  	}
***************
*** 2370,2375 ****
--- 2389,2398 ----
  	    yylval.id = '+';
  	    return OP_ASGN;
  	}
+ 	else if (c == '!') {
+ 	    lex_state = EXPR_BEG;
+ 	    return APLUS;
+ 	}
  	if (lex_state == EXPR_ARG) {
  	    if (space_seen && !isspace(c)) {
  		arg_ambiguous();
***************
*** 3709,3718 ****
--- 3732,3744 ----
  static struct op_tbl rb_op_tbl[] = {
      DOT2,	"..",
      '+',	"+",
+     APLUS,	"+!",
      '-',	"-",
      '+',	"+(binary)",
+     APLUS,	"+!(binary)",
      '-',	"-(binary)",
      '*',	"*",
+     AMULT,	"*!",
      '/',	"/",
      '%',	"%",
      POW,	"**",
---
			豊福@パパイヤ
			unbound / papaya.juice.or.jp
			toyofuku / juice.or.jp