2013年2月12日火曜日

開発環境

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

その他参考書籍

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

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

コメントを投稿