開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- Script言語:Ruby
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 14章(ブロックとproc), 14.4(練習問題)よりよいプログラムロガー を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
よりよいプログラムロガー
コード(BBEdit)
sample.rb
#!/usr/bin/env ruby1.9
#-*- coding: utf-8 -*-
$nesting_depth = 0
def log description, &block
puts "#{" " * $nesting_depth}\"#{description}\"を開始..."
$nesting_depth += 1
res = block.call
$nesting_depth -= 1
puts "#{" " * $nesting_depth}...\"#{description}\"が終了して、戻り値は"
puts "#{" " * $nesting_depth}#{res}"
end
log "外側のブロック" do
log "小さなブロック" do
log "ごく小さなブロック" do
"lots of love"
end
42
end
log "また別のブロック" do
"私はインド料理が好き!"
end
true
end
入出力結果(Terminal)
$ ./sample.rb
"外側のブロック"を開始...
"小さなブロック"を開始...
"ごく小さなブロック"を開始...
..."ごく小さなブロック"が終了して、戻り値は
lots of love
..."小さなブロック"が終了して、戻り値は
42
"また別のブロック"を開始...
..."また別のブロック"が終了して、戻り値は
私はインド料理が好き!
..."外側のブロック"が終了して、戻り値は
true
$
ちなみにJavaScriptの場合。
コード(BBEdit)
String.prototype.repeat = function(n){
var result = "";
for(var i = 0; i < n; i++){
result += this;
}
return result;
};
var nesting_depth = 0;
function log(description, f){
$('#pre0').append(" ".repeat(nesting_depth) + "\"" + description + "\"を開始...\n");
nesting_depth += 1;
var res = f();
nesting_depth -= 1;
$('#pre0').append(" ".repeat(nesting_depth) + "...\"" + description + "\"が終了して、戻り値は\n");
$('#pre0').append(" ".repeat(nesting_depth) + res + "\n");
}
log("外側のブロック", function(){
log("小さなブロック", function(){
log("ごく小さなブロック", function(){
return "Lots of love";
});
return 42;
})
log("また別のブロック", function(){
return "私はインド料理が好き!";
});
return true;
});
pythonの場合。
sample.py
コード(BBEdit)
#!/usr/bin/env python3.3
# -*- coding: utf-8 -*-
nesting_depth = 0
def log(description, func):
global nesting_depth
print("{0}\"{1}\"を開始...".format(" " * nesting_depth, description))
nesting_depth += 1
res = func()
nesting_depth -= 1
print("{0}...\"{1}\"のブロックが終了して、戻り値は".format(
" " * nesting_depth, description))
print("{0}{1}".format(" " * nesting_depth, res))
def g():
log("ごく小さなブロック", lambda: "lots of love")
return 42
def f():
log("小さなブロック", g)
log("また別のブロック", lambda: "私はインド料理が好き")
return True
log("外側のブロック", f)
入出力結果(Terminal)
$ ./sample.py
"外側のブロック"を開始...
"小さなブロック"を開始...
"ごく小さなブロック"を開始...
..."ごく小さなブロック"のブロックが終了して、戻り値は
lots of love
..."小さなブロック"のブロックが終了して、戻り値は
42
"また別のブロック"を開始...
..."また別のブロック"のブロックが終了して、戻り値は
私はインド料理が好き
..."外側のブロック"のブロックが終了して、戻り値は
True
$
perlの場合。
sample.pl
コード(BBEdit)
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
sub my_log{
my($description, $f) = @_;
print "\"" . $description . "\"を開始...\n";
my $res = &$f;
print "...\"" . $description . "\"が終了して戻り値は\n";
print $res . "\n";
}
my_log "外側のブロック", sub{
my_log("小さなブロック", sub{
5;
});
my_log("また別のブロック", sub{
"私はタイ料理が好き!";
});
0;
};
入出力結果(Terminal)
$ ./sample.pl
"外側のブロック"を開始...
"小さなブロック"を開始...
"ごく小さなブロック"を開始...
..."ごく小さなブロック"が終了して戻り値は
lots of love
..."小さなブロック"が終了して戻り値は
42
"また別のブロック"を開始...
..."また別のブロック"が終了して戻り値は
私はインド料理が好き!
..."外側のブロック"が終了して戻り値は
1
$
0 コメント:
コメントを投稿