2015年5月27日水曜日

開発環境

コンピュータプログラミングの概念・技法・モデル(IT Architect' Archiveクラシックモダン・コンピューティング6) (IT Architects’Archive CLASSIC MODER)(セイフ・ハリディ (著)、ピーター・ヴァン・ロイ (著)、Peter Van-Roy (著)、 Seif Haridi (著)、羽永 洋 (翻訳)、翔泳社、原書: Concepts, Techniques, and Models of Computer Programming(CTM))の第部(一般的計算モデル)、第4章(宣言的並列性)、4.11(練習問題)、6.(スレッドのスケジューリング)を解いてみる。

6.(スレッドのスケジューリング)

元の場合と違い、各スレッドが変数の値の束縛により同期されずに、スキップされて、合計されないストリームの要素が出てくるから。本当の合計よりだいぶ小さくなる。

コード(Emacs)

declare Generate Sum Skip

fun {Generate N Limit}
   if N<Limit then
      N|{Generate N+1 Limit}
   else
      nil
   end
end

fun {Sum Xs A}
   case {Skip Xs}
   of X|Xr then {Sum Xr A+X}
   [] nil then A
   end
end

fun {Skip Xs}
   if {IsDet Xs} then
      case Xs
      of _|Xr then {Skip Xr}
      [] nil then nil end
   else Xs end
end

local Xs S in
   thread Xs={Generate 0 150000} end
   thread S={Sum Xs 0} end
   {Browse S}
end

出力結果(Emacs, Oz Compiler)

Mozart Compiler 2.0.0-alpha.0+build.4105.5c06ced (Tue, 2 Sep 2014 18:39:07 +0200) playing Oz 3

declare Generate Sum Skip

fun {Generate N Limit}
   if N<Limit then
      N|{Generate N+1 Limit}
   else
      nil
   end
end

fun {Sum Xs A}
   case {Skip Xs}
   of X|Xr then {Sum Xr A+X}
   [] nil then A
   end
end

fun {Skip Xs}
   if {IsDet Xs} then
      case Xs
      of _|Xr then {Skip Xr}
      [] nil then nil end
   else Xs end
end

local Xs S in
   thread Xs={Generate 0 150000} end
   thread S={Sum Xs 0} end
   {Browse S}
end
Declared variables:
  Generate: procedure/3
  Skip: procedure/2
  Sum: procedure/3
% -------------------- accepted

0 コメント:

コメントを投稿