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つ多い。