開発環境
- 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 コメント:
コメントを投稿