論理型

パステルステッチでは「特殊な値」が必要なときはほとんどの場合に論理型の false が使われる。例えば、他のいかなる要因でも値が決定しない変数は論理型の false になる。また、引数解決ですべての要因が無効であるとき、読み出し演算の戻り値は論理型の false になる。

パステルステッチでは、ほとんどの場合、引数を省略することは引数の値を論理型の false にすることと同じである。制御構文 break もこの規則に当てはまる。

条件分岐では論理型の false を除くすべての値が「真」とみなされる。そのため、論理型の true を使わなくても、任意の値を「真」を表すために使用できる。論理型の false が言語仕様の随所に現れるのに対して、論理型の true が使用される場面は少ない。ただし、論理的に「真」であることを表すためには、ソースコードの意味を明確にするために、論理型の true を使用するべきである。

有理数

有理数の演算の例を示す。

code Rational numbers
print: [get numerator: 3 / 5]
print: [get denominator: 3 / 5]
print: [get numerator: 6 / −4]
print: [get denominator: 6 / −4]
endcode

この例では順に 3, 5, −3, 2 が表示される。3 と 5 はそれぞれ単純に有理数 3 / 5 の分子と分母である。有理数 6 / −4 は、約分されることと、マイナス符号が分子に移動することから、分子と分母はそれぞれ −3 と 2 になる。

ベクトル

ベクトルの演算の例を示す。

code Vectors
print: 2 ∗ a + 3 ∗ b
print: 2 ∗ a + 3 ∗ b + (1 / 2) ∗ (a + b)
peint: 2 ∗ a + 3 ∗ [gismo]
print: (2 ∗ a + 3 ∗ b) ∗ (2 ∗ a + 1 ∗ b)
endcode

この例では順に 2 a:main + 3 b:main, (5/2) a:main + (7/2) b:main, 2 a:main + 3 #000001, 7 のように表示される。ただし具体的な書式は実装依存である。最初の 3 個はベクトル、最後の 1 個 (内積) は有理数である。上記の #000001 は無名ベクトルの内部的な番号であり、プリミティブ演算 gismo を実行するたびに異なる番号になる。

有限集合

ベクトルをコンマで区切って列挙することで有限集合を作ることができる。これは、コンマが和集合を意味することと、ベクトルが要素 1 個の有限集合とみなされることの組み合わせである。以下の例では、実装依存ではあるが、a:main, a:main + b:main, c:main のように表示される。

code Make a finite set
print: a, a + b, c
endcode

ベクトルが有限集合の要素であるかどうかを調べるには、演算子 ⊂ の左辺にベクトルを、右辺に有限集合を置けばよい。これも、ベクトルが要素 1 個の有限集合とみなされるという規則の応用である。演算子 ∈ をこの目的のために使用できないことに注意。演算子 ∈ は型を調べる演算子である。以下の例では順に true と false が表示される。

code Is the vector in the set?
print: a ⊂ a, b
print: a + b ⊂ a, b
endcode

総当たり和は奇妙な演算である。以下の例では、第 1 の print で、4 個のベクトルから成る有限集合 a:main + c:main, a:main + d:main, b:main + c:main, b:main + d:main が表示される。第 2 の print では 3 個のベクトルから成る有限集合 2 a:main, a:main + b:main, 2 b:main が表示される。第 3 の print では 2 個のベクトルから成る有限集合 a:main + b:main, a:main + c:main が表示される。

code Super summation of finite sets
print: (a, b) + (c, d)
print: (a, b) + (a, b)
print: a + (b, c)
endcode

ベクトルが要素 1 個の有限集合とみなされるという規則を考えると、ベクトルとベクトルの和は、総当たり和の特殊な場合である。

プリミティブ演算 pick は集合の各要素に対して処理を行うために必須である。以下の例では、集合の各要素を文字列に変換して、それぞれの文字列の末尾に区切り文字 #delimiter を付加する。

code Format finite set
procedure: format finite set
write: to (main +) value (empty set)
if #main ∈ set ∧ 0 ≤ [size: #main]
 write: to (main +) value (#main)
end
write: to (delimiter +) value (↵)
if #delimiter ∈ string
 write: to (delimiter +) value (#delimiter)
end
write: to (format +) value (empty string)
write: to (set +) value [main +]
loop
 write: to (item +) value [pick: [set +]]
 break: [item +]
 write: to (set +) value ([set +] ∖ [item +])
 write: to (format +) value ([format +] + ([item +] ⇓ string) + [delimiter +])
end
return: [format +]
endcode

この例の loop ブロックの最初の 3 行が、集合の各要素に対して処理を行うためのイディオムである。まずプリミティブ演算 pick で有限集合 set + からベクトル item + を取り出す。集合が空である場合には、プリミティブ演算 pick の戻り値は論理型の false になるので、制御構文 break でループを抜ける。続いて、集合 set + から処理済みのベクトル item + を取り除く。これは差集合 ∖ で可能である。

以下のコードでサブルーチン format finite set を実際に使用する。ベクトル a, b, c に相当する文字列が改行区切りで結合されて出力される。

code Test of format finite set
print: [format finite set: a, b, c]
endcode

無限集合

無限集合の実用的な用途は、非局所制御フロー構文の引数 if と evaluate に使用することである。特に、非局所制御フロー構文で配列 (後述) の値を設定しようとするとき、配列が占有する可能性のある記憶装置の範囲を指定するために、無限集合を使用できる。

無限集合以外のものから無限集合を作成する唯一の方法はプリミティブ演算 span である。すべての無限集合はプリミティブ演算 span と総当たり和と和集合で作成できる。有限集合 (またはベクトル) α0, α1, α2, ..., β1, β2, ... があるとき、すべての無限集合は以下の形で表される。

α0α1 + [span: β1] ∪ α2 + [span: β2] ∪ ...

ここで ∪ は和集合、+ は総当たり和である。

総当たり和と和集合は左辺と右辺がどちらも無限集合であっても計算できる。他の演算は無限集合への適用に制限がある。言語仕様では、無限集合と無限集合を = で比較することすら保証されてない。

文字列

多くのプログラミング言語で、文字列の結合を意味する演算子は + である。パステルステッチの文字列の結合がコンマであるのは、文字列を結合する演算子が算術演算子よりも結合順位が低い方が使いやすいと思われるからである。

文字列を変更するプリミティブ演算 set character in string と、文字列を作成するプリミティブ演算 get string from character では、UTF-8 の文字列として正しくないバイト列を生成することができる。これは、文字列を処理する過程で、UTF-8 の文字列として正しくないバイト列を一時的に経由することが必要になる場合があるためである。

浮動小数点数

浮動小数点数の誤差の扱いは実装依存である。そのため、浮動小数点数で正確な演算を行うには、ホスト言語の仕様を確認する必要がある。

型についての演算

型変換 ⇓ は成功するとは限らない。型変換で得られた値が正しいかどうか確認してから使用する必要がある。型変換に失敗した場合は戻り値が論理型の false になるので、通常は、戻り値が「真」であるかを確認すればよい。