開発環境
- 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 -*-
def log description, &block
  puts "\"#{description}\"を開始..."
  bln = block.call
  puts "...\"#{description}\"なブロックが終了して、戻り値は"
  puts bln
end
log "外側のブロック" do
  log "小さなブロック" do
    5
  end
  log "また別のブロック" do
    "私はタイ料理が好き!"
  end
  false
end
入出力結果(Terminal)
$ ./sample.rb "外側のブロック"を開始... "小さなブロック"を開始... ..."小さなブロック"なブロックが終了して、戻り値は 5 "また別のブロック"を開始... ..."また別のブロック"なブロックが終了して、戻り値は 私はタイ料理が好き! ..."外側のブロック"なブロックが終了して、戻り値は false $
ちなみにJavaScriptの場合。
コード(TextWrangler)
function log(description, f){
  $('#pre0').append('"' + description + '"を開始...\n');
  var bln = f();
  $('#pre0').append('..."' + description + '"が終了して、戻り値は\n');
  $('#pre0').append(bln + '\n');
}
log('外側のブロック', function(){
  log('小さなブロック', function(){
    return 5
  });
  log('また別のブロック', function(){
    return "私はタイ料理が好き!";
  });
  return false;
});
pythonの場合。
sample.py
コード(TextWrangler)
#!/usr/bin/env python3.3
# -*- coding: utf-8 -*-
def log(description, f):
    print("\"{0}\"を開始...".format(description))
    bln = f()
    print("...\"{0}\"が終了して、戻り値は".format(description))
    print(bln)
def f():
    log("小さなブロック", lambda: 5)
    log("また別のブロック", lambda: "私はタイ料理が好き!")
    return False
log("外側のブロック", f)
入出力結果(Terminal)
$ ./sample.py "外側のブロック"を開始... "小さなブロック"を開始... ..."小さなブロック"が終了して、戻り値は 5 "また別のブロック"を開始... ..."また別のブロック"が終了して、戻り値は 私はタイ料理が好き! ..."外側のブロック"が終了して、戻り値は False $
rubyとかjavascriptみたいに、pythonで関数の引数にブロック(javascriptでは無名関数)渡して、もっと短くコードを書く方法あるのかな〜直接引数に渡せる匿名関数のlambda式だと戻り値はあるけど、関数の呼び出しが出来ないし。。
 
0 コメント:
コメントを投稿