開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- プログラミング言語: Ruby
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 14章(ブロックとproc), 14.4(練習問題)よりよいプログラムロガー を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
よりよいプログラムロガー
コード(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 コメント:
コメントを投稿