Concurrent Clean : CleanJ : 基本値の正格リストの実装が完了 & レコード型非ボックス化リスト
StdOverloadedListの関数に対するテストも完了。
-
-
- -
-
次は、レコード型の非ボックス化正格リストの実装。
レコード型非ボックス化リストが必要なときは、次のレコードが生成される。
.record r_Cons#Rec lRiaa 2 1 "[#Rec]"
対応しているレコードは、
::Rec = {a :: !Int, b :: Int}
で、ABCマシンコードでは
.record r5 ia 1 1 "Rec"
「lRiaa」のうち、最初の「lR」の部分は意味はなさそうだが・・・。
「iaa」のうち、最後の「a」が次のconsになるようだが、nilはどう扱うのだろうか?
また、プリティプリンタはどうしよう。
-
-
- -
-
こういうレコード型を定義すると、かなり面倒になる。
:: * !!! = {a :: !Int, b :: Int}
.record r5 ia 1 1 "!!!" .record r_Cons#!!!! lRiaa 2 1 "[#!!!!]" .record r_Cons#!!! lRiaa 2 1 "[#!!!]"
-
-
- -
-
ところで、この型の場合は、プリティプリンタで興味深いバグが発生する。
:: * !!! = {a :: !Int, b :: Int} Start = ([#r 1, r 2, r 3] ,[#r 1, r 2, r 3 !]) r x = { !!! |a = x, b = x}
の実行結果が、
([!!! 1 1,!!! 2 2,!!! 3 3],[!!!! 1 1,!!!! 2 2,!!!! 3 3])
のようになる。後半の方は「!」の数が1つ多い。