記憶装置

記憶装置のうち 1 個の値を記憶できる部分を、この文章では「記憶素子」と呼ぶ。記憶装置では 1 個のベクトルに 1 個の記憶素子が対応する。

パステルステッチではユーザーが型を追加することが原則としてできない。ホスト言語との API でユーザー定義型を追加することはできるが、パステルステッチで書かれたプログラムの内部では、型を追加する方法は用意されていない。かわりに、複数の記憶素子を組み合わせることで、所望のデータ構造を表現することができる。複数の記憶素子を組み合わせたデータを「複合データ」と呼ぶ。

例えば、3D グラフィックを描画するために x, y, z 座標の組み合わせが必要であるとする。りんごを描画するにあたって、ベクトル apple + x, apple + y, apple + z が表す記憶素子を、それぞれりんごの x, y, z 座標のために使用できる。

他のプログラミング言語でいうところの配列も、パステルステッチでは、複数の記憶素子を組み合わせて表現する。りんごの配列を apples というベクトルで表したいとき、個々のりんごはベクトル apples, apples + step, apples + 2 ∗ step, apples + 3 ∗ step, ... で表される。ここで、配列の要素間の間隔を表すベクトル step は任意のベクトルを使用できる。ベクトル step のかわりに、例えば step x と step y のような複数のベクトルを用いれば、多次元配列を表現できる。多次元配列の要素 (x, y) はベクトル apples + x ∗ step x + y ∗ step y に相当する。

プリミティブ演算 distribute と非局所制御フロー構文の組み合わせを複合データのために使用できる。りんごの座標が記憶装置に書き込まれていないとき、バナナの座標をデフォルトとして使うには、以下のようにする。

code Non-local control flow and distribute operation
suggest: if [distribute: vector ($verb) set (x, y, z) auxiliary set (apple)]
> evaluate [banana + [distribute: vector ($verb) set (x, y, z) auxiliary set (apple)]]
endcode

配列が潜在的に占有しうる記憶素子の範囲を表すために無限集合を使用できる。例えば、りんごの 2 次元配列が占有しうる記憶素子の範囲は、無限集合 apples + [span: step x, step y] で表される。これらのりんごの座標の初期値を非局所制御フロー構文で指定するには、以下のようにする。

code: Infinite set
suggest: if [distribute: vector ($verb) set (x, y, z) auxiliary set
> (apples + [span: step x, step y])]
> evaluate [banana + [distribute: vector ($verb) set (x, y, z)
> auxiliary set (apples + [span: step x, step y])]]
endcode

非局所制御フロー構文は無限集合のほとんど唯一の実用的な用途である。