Concurrent Clean : リストの一括出力
module main import StdEnv Start :: *World -> *World Start w # lst = [0,1,2,3,4,5,6,7,8,9] # lst2 = map (\ x = x*2) lst # (c, w) = stdio w # c = foldr writeline_r c lst2 # c = fwrites "----\n" c # c = foldl writeline_l c lst2 # (_, w) = fclose c w = w where writeline_r i c # c = fwritei i c # c = fwrites "\n" c = c writeline_l c i # c = writeline_r i c = c
Startから環境を引っ張っていかないと出力ができないということは、ERPのような大規模アプリケーションを作成するときには、アプリケーションのデザインが難しくならないかな?
ところで、上記のテクニックは、ダイアログで編集した複数のデータオブジェクトを一括でDBに保存するようなときに使える手法で、Cなどの手続き型言語でも結構使います。下は、また例によっていい加減な言語で。
//このmap関数は、自作ユーティリティとして準備しておく
void map(File file, void *func(int), int list)
{
for(int i=0; i < length(list); i++)
{
func(file, list[i]);
}
}
//以下の関数を必要に応じて作成して利用
void savefile(File file, int i)
{
file.writeln(i);
}
void main()
{
int x = {0,1,2,3,4,5,6,7,8,9};
map(stdout, savefile, x);
}
この場合、エラーが起こった場合は、例外を投げて脱出する必要があるのですが、Cleanって、例外を投げれるのかな?
-
-
- -
-
例外を使わなくても、これでいいね。
module main import StdEnv Start :: *World -> *World Start w # lst = [0,1,2,3,4,5,6,7,8,9] # lst2 = map (\ x = x*2) lst # (c, w) = stdio w # (ok, c) = foldr writeline_r (True, c) lst2 # c = fwrites "----\n" c # (ok, c) = foldl writeline_l (True, c) lst2 # (_, w) = fclose c w = w where writeline_r i (ok, c) | ok # c = fwritei i c # c = fwrites "\n" c = (True, c) = (False, c) writeline_l (ok, c) i = writeline_r i (ok, c)