パステルステッチは以下の 8 種類のデータ型を持ちます。

このうち、ベクトルは有限集合の特殊な場合であり、有限集合は無限集合の特殊な場合です。また、パステルステッチで「整数」と言った場合、実際には分母が 1 の有理数を指します。

論理型

論理型には「真」と「偽」の 2 種類の値があります。名前 truemain と falsemain はそれぞれ論理型の「真」と「偽」を表します。比較演算子 =, <, ≤, ⊂ の値は論理型です。

論理型の値に対して論理演算 ∧, ∨, ¬, ⊥ を使用できます。意味はそれぞれ、論理積、論理和、論理否定、論理否定です。¬ と ⊥ はどちらも論理否定ですが、演算子の結合順位が異なります。論理型でない値に対してこれらの論理演算を行った場合は、論理型でない値は「真」と解釈されます。また、条件分岐では、論理型でない値は「真」と解釈され、論理型の false だけが「偽」と解釈されます。

有理数

パステルステッチの有理数は、符号、分子、分母の組です。符号は有理数が正であるか負であるかを表します。分子は 0 以上の整数であり、分母は 0 より大きい整数です。ただし、分子が 0 であるとき、符号は正で、分母は 1 であることが保証されています。また、分子と分母は常に既約です。分子と分母の最大値は実装依存であり、実装によってはオーバーフローすることがあります。

有理数に対して演算子 +, −, ∗, / でそれぞれ加算、減算、積算、除算ができます。有理数に対してこれらの演算を行ったとき、演算の結果も有理数です。ただし、0 で除算したときは、演算の結果は論理型の false になります。また、実装によっては、演算の過程でオーバーフローが発生したとき、論理型の false を返すことがあります。

姓が main, decimal, hexadecimal のいずれかで、数値として解釈できる固有名を持つ名前は、数値定数として解釈されます。この数値定数は 0 以上の整数を表現できるので、演算子 − と / を組み合わせることで任意の有理数を表現できます。

プリミティブ演算 get numerator と get denominator は、それぞれ、有理数から分子と分母を取り出します。取り出された分子と分母はいずれも整数 (分母が 1 の有理数) です。取り出された分子の符号は、もとの有理数の符号と一致します。取り出された分母の符号は常に正です。

なお、プリミティブ演算 get numerator と get denominator の姓は main です。以後、断りのない限り、プリミティブ演算の名前の姓は main です。

有理数の大小関係は演算子 =, <, ≤ で比較することができます。

ベクトル

パステルステッチの「ベクトル」は他のプログラミング言語の “vector” とは異なります。パステルステッチのベクトルは記憶装置、サブルーチン、プリミティブ演算などのアドレスを指し示すために使われます。

ベクトルは基底ベクトルと複合ベクトルに分類されます。基底ベクトルは以下のような性質を持ちます。

基底ベクトルはさらに有名ベクトルと無名ベクトルに分類されます。パステルステッチの「名前」は、特別に予約されているものを除くと、有名ベクトルとして解釈されます。また、無名ベクトルは、プリミティブ演算 gismo の戻り値として得られます。

基底ベクトルに対してスカラー倍と加算を行うことで得られるベクトルが「複合ベクトル」です。ここでスカラー倍とは、ベクトルと有理数との積のことです。なお、零ベクトルは複合ベクトルに分類されます。任意の基底ベクトルに有理数 0 を積算することで零ベクトルを作ることができるためです。

ベクトルとベクトルを加算または減算することができます。演算子 + と − の左辺と右辺をともにベクトルとすると、それぞれベクトルの加算と減算になります。

左辺のない + は右辺の値をそのまま演算の結果とします。また、左辺のない − は −1 倍を意味します。

演算子 ∗ の左辺と右辺の一方が有理数で、もう一方がベクトルであるとき、有理数とベクトルの積を表します。有理数とベクトルの積はベクトル型です。また、演算子 / の左辺がベクトルで右辺が有理数であるとき、右辺の有理数の逆数と左辺のベクトルの積を表します。ただし、右辺が 0 であるときは、演算の結果は論理型の false になります。

演算子 ∗ の左辺と右辺がともにベクトルであるとき、内積を表します。ベクトルの内積は有理数です。

ベクトルが等しいかどうか比較することができます。演算子 = の両辺がベクトルであるとき、両辺のベクトルが等しいかどうか比較します。

その他、以下のようなプリミティブ演算があります。

有限集合

パステルステッチで「集合」とはベクトルの集合のことを言います。集合には有限集合と無限集合があります。

2 個の有限集合があるとき、和集合、積集合、差集合を計算することができます。和集合はコロンで、積集合と差集合はそれぞれ演算子 ∩ と ∖ で表します。また、2 個の有限集合があるとき、演算子 = と ⊂ で比較演算ができます。前者は完全一致、後者は包含を意味します。

加算演算子 + の両辺が有限集合であるとき「総当たり和」を意味します。これは、左辺の有限集合と右辺の有限集合からそれぞれ1 個ずつのベクトルを選んで、それらを加算して得られるベクトルを、すべての組み合わせについて集めた集合です。同様に、演算子 − の両辺が有限集合であるとき「総当たり差」を意味します。これは、左辺の有限集合と右辺の有限集合からそれぞれ1 個ずつのベクトルを選んで、前者から後者を減算して得られるベクトルを、すべての組み合わせについて集めた集合です。

ベクトルの場合と同様に、左辺のない + は右辺の値をそのまま演算の結果とします。また、左辺のない − は −1 倍を意味します。

演算子 ∗ の左辺と右辺の一方が有理数で、もう一方が有限集合であるとき、演算の結果は、有限集合に属するすべてのベクトルと有理数との積を集めた集合になります。同様に、演算子 / の左辺が有限集合で右辺が有理数であるとき、右辺の有理数の逆数と左辺の有限集合に属するすべてのベクトルとの積を集めた集合を表します。ただし、右辺が 0 であるときは、演算の結果は論理型の false になります。

ベクトルは有限集合の特殊な場合です。すなわち、要素が 1 個の有限集合はベクトルと同一視されます。集合に対する演算にベクトルを与えた場合、ベクトルは要素が 1 個の有限集合と解釈されます。また、集合に対する演算の結果が、要素が 1 個の有限集合であるとき、実際の演算の結果はベクトルになります。

プリミティブ演算 size で有限集合の要素数を得ます。要素数は整数 (分母が 1 の有理数) で得られます。空集合の要素数は 0、ベクトルの要素数は 1 とみなします。

プリミティブ演算 pick は有限集合の要素のうちの 1 個のベクトルを得ます。どのベクトルを得られるかは実装依存です。プリミティブ演算 pick の引数がベクトルであるとき、戻り値はそのベクトルそのものになります。また、プリミティブ演算 pick の引数が空集合または無限集合であるとき、戻り値は論理型の false になります。

プリミティブ演算 distribute は「ベクトルの分配」を表します。プリミティブ演算 distribute は vector, set, auxiliary set という 3 個の引数をとります。この演算は、引数 vector をベクトル x、引数 set と auxiliary set をそれぞれ集合 α, β としたとき、以下の数式を満たすベクトルの組 yz を探します。

このような組み合わせが見つかれば、プリミティブ演算 distribute の戻り値は上記のベクトル y になります。見つからなければ論理型の false になります。

無限集合

無限集合はプリミティブ演算 span で作成します。プリミティブ演算 span は 1 個の引数をとり、この引数は有限集合である必要があります。さらに、実装によっては、この引数は基底ベクトルの有限集合である必要があります。このとき得られる無限集合は、与えられた有限集合の各要素と任意の有理数との積の和 (すなわち、与えられた有限集合の各要素の線型結合) として得られるベクトルの集合です。

無限集合と無限集合の和集合を計算することができます。それに対して、無限集合と無限集合の積集合を計算することはできません。積集合では、左辺か右辺の少なくともいずれかが有限集合である必要があります。また、差集合の右辺は無限集合であってもかまいませんが、差集合の左辺は有限集合である必要があります。無限集合と無限集合が同一であるかどうかを比較しようとした場合、正しく比較されることは保証されません。集合の包含関係を比較するときは、右辺は無限集合であってもかまいませんが、左辺は有限集合である必要があります。これらの演算の記号は、有限集合の場合と同様に、順にコンマ、∩, ∖, =, ⊂ です。

無限集合と無限集合の総当たり和を計算することができます。また、同様に、無限集合と無限集合の総当たり差を計算することができます。これらの演算の記号は、有限集合の場合と同様に、順に + と − です。

ベクトルまたは有限集合の場合と同様に、左辺のない + は右辺の値をそのまま演算の結果とします。また、左辺のない − は −1 倍を意味します。

演算子 ∗ の左辺と右辺の一方が有理数で、もう一方が無限集合であるとき、演算の結果は、無限集合に属するすべてのベクトルと有理数との積を集めた集合になります。同様に、演算子 / の左辺が無限集合で右辺が有理数であるとき、右辺の有理数の逆数と左辺の無限集合に属するすべてのベクトルとの積を集めた集合を表します。ただし、右辺が 0 であるときは、演算の結果は論理型の false になります。これは有限集合の場合とまったく同じです。

有限集合は無限集合の特殊な場合です。これは、2 個の無限集合に対する演算が可能であれば、1 個の無限集合と 1 個の有限集合に対する演算も可能であるということです。和集合、総当たり和、総当たり差がこれに該当します。

プリミティブ演算 size の引数が無限集合であるとき、戻り値は論理型の false になります。また、プリミティブ演算 distribute の引数 set と auxiliary set には無限集合を使用できます。

文字列

コンマ記号は文字列に対しては文字列の結合を意味します。また、コンマ記号の左辺が文字列であり、右辺が他の型である場合は、右辺を文字列に変換してから結合します。

文字列と文字列の比較は演算子 =, <, ≤ を使用できます。演算子 = は文字列と文字列が等しいかどうか比較します。< と ≤ は文字列を辞書式順序で比較します。

パステルステッチの文字列は UTF-8 でエンコードされています。文字列はバイトの列であり、1 バイトは 8 ビットです。プリミティブ演算 size の引数が文字列であるとき、文字列のバイト数が得られます。

プリミティブ演算 get character from string は引数 main と at をとります。引数 main は文字列、引数 at は整数 (分母が 1 の有理数) である必要があります。この演算は、引数 main で指定された文字列の、引数 at で指定された位置にあるバイトを得ます。得られたバイトは 0 以上 256 未満の整数になります。引数 at で指定された位置が文字列の範囲外である場合は、論理型の false が戻り値になります。また、引数 at を省略した場合は、文字列の先頭のバイトを得ます。

プリミティブ演算 set character in string は引数 main, at, in をとります。引数 main, at, in はそれぞれ整数、整数、文字列である必要があります。この演算は、引数 in で指定された文字列の、引数 at で指定された位置のバイトを、引数 main で指定されたバイトに置き換えた文字列を戻り値とします。引数 at で指定された位置が引数 in で指定された文字列の範囲外である場合、または、引数 main が 0 以上 256 未満の整数でない場合は、論理型の false が戻り値になります。

プリミティブ演算 get string from character は、0 以上 256 未満の整数を引数として、1 バイトの文字列を得ます。

浮動小数点数

浮動小数点数は算術演算 +, −, ∗, / と 比較演算 =, <, ≤ が可能です。左辺を省略した + と − も使用できます。

コンティニュエーション

コンティニュエーションに対して行う演算はありません。

型についての演算

値の型を判別するには ∈ 演算子を使います。この演算子の左辺に判別したい値を与え、右辺に「型の名前」を与えると、結果が論理型で得られます。型の名前とは、以下の有名ベクトルです。

これらの有名ベクトルの姓はすべて main です。

ベクトル、有限集合、無限集合の型の名前はすべて set です。これらを区別するにはプリミティブ演算 size を使用してください。

値を別の型に変換するには ⇓ 演算子を使います。この演算子の左辺に値を、右辺に型の名前を与えます。変換に成功すればその値が得られますが、変換できない組み合わせを指定した場合には論理型の false になります。

型の変換には以下のような規則があります。

他の組み合わせは実装依存です。