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)