2012年11月30日金曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 14章(ブロックとproc), 14.4(練習問題の続き)よりよいプログラムロガー を解いてみる。

その他参考書籍

よりよいプログラムロガー

コード(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 コメント:

コメントを投稿