開発環境
- OS X Lion - Apple(OS)
- TextWrangler(Text Editor) (BBEditの機能制限無料版、light版)
- 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クックブック ―エキスパートのための応用レシピ集
よりよいプログラムロガー
コード(TextWrangler)
sample.rb
#!/usr/bin/env ruby1.9 # -*- coding: utf-8 -*- $nesting_depth = 0 def log description, &block puts " " * $nesting_depth + "\"#{description}\"を開始..." $nesting_depth += 1 bln = block.call $nesting_depth -= 1 puts " " * $nesting_depth + "...\"#{description}\"なブロックが終了して、戻り値は" puts " " * $nesting_depth + bln.to_s 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の場合。
コード(TextWrangler)
var nesting_depth = 0; String.prototype.repeat = function(n){ if(n < 0) throw "自然数(0を含む)になっていない"; 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 bln = f(); nesting_depth -= 1; $('#pre0').append(" ".repeat(nesting_depth) + '..."' + description + '"が終了して、戻り値は\n'); $('#pre0').append(" ".repeat(nesting_depth) + bln + '\n'); } log('外側のブロック', function(){ log('小さなブロック', function(){ log('ごく小さなブロック', function(){ return "lots of love"; }); return 42 }); log('また別のブロック', function(){ return "私はインド料理が好き!"; }); return true; });
pythonの場合。
sample.py
コード(TextWrangler)
#!/usr/bin/env python3.3 # -*- coding: utf-8 -*- nesting_depth = 0 def log(description, f): global nesting_depth print("{0}\"{1}\"を開始...".format(" " * nesting_depth, description)) nesting_depth += 1 bln = f() nesting_depth -= 1 print("{0}...\"{1}\"が終了して、戻り値は".format(" " * nesting_depth, description)) print("{0}{1}".format(" " * nesting_depth, bln)) 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 $
0 コメント:
コメントを投稿