Concurrent Cleanとオブジェクト指向
http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap5.html
あれこれと考えていたのですが、ドキュメントを見ると、レコード型のところに、オブジェクト指向スタイルのプログラミングの例がちょっと載っていました。
ところが、想像していたのと違ったのは、「レコードは、カリー化された方法では使用できない。」という制限でした。なので、Cleanでも、LispのCLOSのように「Get obj」や「Set 1 obj」という記法になってしまうようです。
正格な評価や、破壊的更新をサポートする記法は存在するようなので、その辺の懸念はクリアしそうです。
module obj import StdEnv ::Object = E.x: { state :: x , get :: x -> Int , set :: x Int -> x } CreateObject1:: Object CreateObject1 = {state = [], get = myget, set = myset} where myget:: [Int] -> Int myget [i:is] = i myget [] = 0 myset:: [Int] Int -> [Int] myset is i = [i:is] CreateObject2 = {state = 0.0, get = myget, set = myset} where myget:: Real -> Int myget r = toInt r myset:: Real Int -> Real myset r i = r + toReal i Get:: Object -> Int Get {state,get} = get state Set:: Int Object -> Object Set i o=:{state,set} = {o & state = set state i} Start:: [Object] Start = map (Set 3) [CreateObject1,CreateObject2]