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