丁稚な日々

Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...

[直前] [最新] [直後] [Top]

Jun.18,2008 (Wed)

Revision: 1.6 (Jun.19,2008 05:22)

hack

_ もーすぐRuby会議2008ですね。
1ヶ月ほど日記をサボってる間にruby 1.8.7が出たり1.8.7-p17が出たりしましたが皆さんお元気でしょうか。

_ さて、遠藤さんに唆されてこんなhackをしてしまいました。

Index: parse.y
===================================================================
--- parse.y	(revision 17414)
+++ parse.y	(working copy)
@@ -696,6 +696,7 @@ static void ripper_compile_error(struct 
 %token tCOLON2		/* :: */
 %token tCOLON3		/* :: at EXPR_BEG */
 %token <id> tOP_ASGN	/* +=, -=  etc. */
+%token tOP_ASGN2	/* .= */
 %token tASSOC		/* => */
 %token tLPAREN		/* ( */
 %token tLPAREN_ARG	/* ( */
@@ -720,7 +721,7 @@ static void ripper_compile_error(struct 
 %left  keyword_or keyword_and
 %right keyword_not
 %nonassoc keyword_defined
-%right '=' tOP_ASGN
+%right '=' tOP_ASGN tOP_ASGN2
 %left modifier_rescue
 %right '?' ':'
 %nonassoc tDOT2 tDOT3
@@ -3426,6 +3427,15 @@ method_call	: operation paren_args
 			$$ = method_optarg($$, $4);
 		    %*/
 		    }
+		| variable tOP_ASGN2 operation2 opt_paren_args
+		    {
+		    /*%%%*/
+			$$ = assignable($1, NEW_CALL(gettable($1), $3, $4));
+		    /*%
+			$$ = dispatch3(call, $1, ripper_id2sym('.'), $3);
+			$$ = method_optarg($$, $4);
+		    %*/
+		    }
 		| primary_value tCOLON2 operation2 paren_args
 		    {
 		    /*%%%*/
@@ -6562,6 +6572,10 @@ parser_yylex(struct parser_params *parse
 	    pushback(c);
 	    return tDOT2;
 	}
+	else if (c == '=') {
+	    lex_state = EXPR_BEG;
+	    return tOP_ASGN2;
+	}
 	pushback(c);
 	if (ISDIGIT(c)) {
 	    yyerror("no .<digit> floating literal anymore; put 0 before dot");

ちょっと手抜きではありますが、こんなことができるようになります。

% ruby -e 'i = 0; i .= succ; p i'
1
% ruby -e 's = "foo"; s .= center(5); p s'
" foo "

bang版がないメソッドを破壊的に使いたいとき便利かもしれないですな。

Jun.19,2008 (Thu)

Revision: 1.3 (Jun.19,2008 04:45)

e.exe

_ rubyとは関係ないけど、10年ほど前から自作して使っているツールを晒してみることにしました。
年代モノのソースなので中身はなかなかしっちゃかめっちゃかですが、ま、わかる人だけ使ってねということで。

_ 何をするものかというと、コマンドプロンプト(じゃなくてもいいんだけど)からエディタを起動するものです。
以下のようなことができます。あ、e.exeっていうファイル名なのでそこんとこよろしく。

C:\> e a.txt
(a.txtをエディタで開く)
C:\> dir | e
(dirの結果を一時ファイル経由でエディタで開く)
C:\> e
(コマンドプロンプトの画面バッファの内容を一時ファイル経由でエディタで開く)

_ インストーラとかなくて自分でPath通せという漢仕様なので、意味わからない人はあきらめてください。
まあ、コマンドプロンプト使う人なら大丈夫だよねきっと。

_ ダウンロードはこちらから: e-110.zip
テキストファイル類の改行が全部LFなのは単なる嫌がらせなので気にしないでください。

Jun.20,2008 (Fri)

Revision: 1.2 (Jun.20,2008 23:51)

被捕捉アンテナ類
[Ant] [Antenna-Julia] [Rabbit's Antenna] [Ruby hotlinks]