kiyo_hikoのブログ

メモ+日記?

Perl:アイディア:リソースの回収

アイディアをメモして置いとく。あと雑記


リソースリークを防ぎつつスクリプトの煩雑化を防ぐ技を考えていた。
gotoと関数オブジェクト (サブルーチンレファレンス) を組み合わせたものを試作した。
開いたリソースはLIFO的にきっちり閉じる。つもり…。


例外処理っぽい単語はだいたいRubyから拝借。
自宅だとPerl使わないから処理系も入ってなくて、ランタイムコンパイラーがやってくれる文法チェックすら通してない。ちゃんと動くかどうかは謎。

use strict;
use warnings;

Test->new->execute(qw/in.txt out.txt/);

{
	package Test;
	
	sub new {bless {}, $_[0]}
	
	sub execute {
		my $this = shift;
		my $e;
		my $raise = sub {
			($e) = @_;
			goto rescue;
		};
		my ($fin, $fout) = @_;
		my ($in, $out, @after);
		
		open $in , '<', $fin  ? unshift @after, sub {close $in } : $raise->('error');
		open $out, '>', $fout ? unshift @after, sub {close $out} : $raise->('error');
		
		while (<$in>) {print {$out} $_ or $raise->('error')}
		
		goto ensure;
		
		rescue: {
			print "$e\n";
		}
		
		ensure: {
			$_->() for @after;
			! $e ? 1 : return;
		}
	}
}

もうちょっと綺麗にならないかなー。beforeとafterの関係を宣言的に書けると良さそうなんだけども


それと、全く関係ないけど、Perlにもmapcarがほしい。

その他

C

買ってた。少しづつ読んでる。
リソースリーク対策の話も載ってて、Template Methodパターンでやる話がある。

クイズ

金欠で生活費すら危ういのでかなり抑え気味。
理系魔龍で出没しまくりたいけど非常にダメげな予感。
経済的不安によって絶賛腹壊し中という。夜も眠れない。

きよツール

あまり進んでない。
Venue 8 Proが来年1月らしいしモチベが…。
(手持ちの大きなラップトップで使うのがめんどくさくなってきてしまったらしい)


直近の目標:

  • ジャンルと形式をフィルタリングするように
  • jarにしてもUTF-8Nを文字化けしないで読み込む
  • 25問リピート出題モード追加する


順調なら来春あたりにお試し用に機能限定版公開するかも