2013年3月20日水曜日

開発環境

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

その他参考書籍

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

コード(BBEdit)

sample.rb

#!/usr/bin/env ruby2.0
#-*- 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)

var $result = $('#pre0'),
    pre = 0;
    log = function( d, fn ) {
        var result;
        $result.append(new Array(pre + 1).join("    ") + '"' + d + '"を開始…\n');
        pre += 1;
        result = fn();
        pre -= 1;
        $result.append(new Array(pre + 1).join("    ") + '…"' + d + '"が終了して、戻り値は\n');
        $result.append(new Array(pre + 1).join("    ") + result + '\n');
    };
$result.html('');
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 -*-

pre = 0
def log(d,fun):
    global pre
    print("{0}\"{1}\"を開始…".format("    " * pre, d))
    pre += 1
    res = fun()
    pre -= 1
    print("{0}…\"{1}\"が終了して、戻り値は".format("    " * pre, d))
    print("{0}{1}".format("    " * pre, 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";

my $pre = 0;
sub myLog{
    my($description, $f) = @_;
    print "    " x $pre, "\"$description\"を開始…\n";
    $pre += 1;
    my $result = &$f;
    $pre -= 1;
    print "    " x $pre, "…\"$description\"が終了して、戻り値は\n";
    print "    " x $pre, "$result\n";
}
myLog( "外側のブロック", sub {
    myLog("小さなブロック", sub {
        myLog("ごく小さなブロック", sub {
            "lots of love";
        });
        42;
    });
    myLog("また別のブロック", sub { "私はインド料理が好き!" });
    return 1;
});

入出力結果(Terminal)

$ ./sample.pl
"外側のブロック"を開始…
    "小さなブロック"を開始…
        "ごく小さなブロック"を開始…
        …"ごく小さなブロック"が終了して、戻り値は
        lots of love
    …"小さなブロック"が終了して、戻り値は
    42
    "また別のブロック"を開始…
    …"また別のブロック"が終了して、戻り値は
    私はインド料理が好き!
…"外側のブロック"が終了して、戻り値は
1
$

0 コメント:

コメントを投稿