文法

コードとコメントの区分

まずは簡単なプログラムを実際に書いてみましょう。このプログラムは画面に “Hello world!” と表示します。

code Simple program
print: ⟨Hello world!⟩ ↵
endcode

プログラムのコードは codeendcode の間に書きます。その外側はコメントです。また、code の右側の、行が終わるまでの部分もコメントになります。この例では “Simple program” というコメントを入れています。複数の codeendcode の組を書くこともできます。

ブロック

ブロックは複数の文をまとめたものです。ブロックは「ブロック開始語」で始まります。ブロックの最初の文を「ブロック開始文」と呼びます。ブロック開始文はブロック開始語と引数部から成ります。ブロック開始語と引数部の間にはコロンを入れません。ブロックを終了するには end を書きます。

ブロック開始語は if, loop, procedure, mulde, initialize, continuation の 6 種類です。 下の例では mulde と procedure がブロック開始語です。

code Block
procedure proc
 print: ⟨procedure⟩ ↵
end
mulde
 print: ⟨mulde⟩ ↵
 proc
endcode

ブロックの中にブロックを入れることもできます。下の例では mulde, mulde, procedure の順に 3 重のブロックを作っています。

code Block nesting
mulde
 print: ⟨external⟩ ↵
mulde
  print: ⟨mulde⟩ ↵
  procedure internal
   print: ⟨internal⟩ ↵
  end
end
end
endcode

endcode を記述すると、パステルステッチのプログラムを閉じてコメントに戻ります。このとき、閉じていないブロックがあると、それらのブロックはすべて閉じたことになります。たとえば、上の例は以下のように書き直すことができます。

code Block and endcode
mulde
 print: ⟨external⟩ ↵
mulde
  print: ⟨mulde⟩ ↵
  procedure internal
   print: ⟨internal⟩ ↵
endcode

改行は文と文とを区切ります。ただし、行継続の記号を行の先頭に置くと、改行は文の区切りではなくなります。他のプログラミング言語で「大なり」を表す記号 > はパステルステッチでは行継続を表します。行継続の記号は、無効化したい改行の次の行の先頭に置きます。行継続の左側に空白文字があってもかまいません。

code Continue line
write: to (jumped over the lazy dog) value (10)
write: to (a quick brown fox)
> value (jumped over the lazy dog)
print: [[a quick brown fox]], ↵
endcode

文は述語部と引数部に分かれます。述語部と引数部はコロンで区切ります。述語部には式または制御命令を書きます。

引数部は単独形式か前置詞形式のいずれかで書きます。単独形式は引数部に式を 1 個書くものです。前置詞形式は前置詞と式の組を複数 (1 組以上) 書くものです。前置詞の後に続く式は全体が括弧 (パーレンまたはブラケット) で囲まれているか、文字列または演算子の名前または浮動小数点数である必要があります。前置詞の後に続く式を「前置詞の目的語」とも呼びます。単独形式の引数部は、前置詞 “main” を用いた前置詞形式と同じです。

また、引数部はなくても構いません。引数部を省略するとき、述語部の後にコロンを置きません。

以下の例では write は前置詞形式、print は単独形式の引数部を持っています。write の前置詞は to と value です。

code Prepositions
write: to (yokodashi) value ⟨yokohama kaidashi kikou⟩
write: to (ykk) content [yokodashi]
print: [ykk], ↵
endcode

文の先頭に文字列があると倒置文になります。目的語のない前置詞があると、倒置された文字列が、その前置詞の目的語になります。また、倒置文では、行継続の記号がなくても、文字列が続く限り文が続きます。

code Inversion
⟨I seem to have chosen my path. ⟩
⟨I wonder where I want to go today... ⟩
> print: main
⟨I slowly wander about like this. ⟩
⟨This place is at the edge of sky and earth. ⟩
> print: main
⟨At times like these, ⟩
⟨I am but a bump on the protruding earth. ⟩
> write: to (protruding earth) value
print: [protruding earth]
print: ↵
endcode

式と式を演算子で結合したものは式です。また、式をパーレン (...) で囲んだものは式です。名前、文字列、浮動小数点数はそれ自体が式の一種です。

述語部と引数部をブラケット [...] で囲んだものは「読み出し演算」で、これも一種の式です。述語部と引数部の内容は「文」の場合と同じです。また、述語部と引数部の間にコロンを置くこと、引数部を省略するときはコロンを置かないことは、文と同様です。

演算子

算術演算は +, −, ∗, / の 4 種類です。 結合順位は ∗ が最強で、+ と − が同列でそれに続き、/ が最弱です。除算 / の結合順位は一般的な数式と異なります。

code Arithmetic binary operators
print: 10 ∗ 20
write: to (a) value (30 + 40 ∗ 50)
print: 100 + 200 ⁄ 300 + 400
write: to (b) value (500 ∗ 600 / 700 + 800)
endcode

左辺のないマイナス記号は −1 倍を表します。また、右辺のないプラス記号は変数 #offset が省略されているとみなします。

code
write: to (a +) value ((−20) ∗ 10 + (−10 ∗ 20))
print: [a +]
endcode

集合演算は和集合、積集合、差集合の 3 種類があります。和集合はコンマで、積集合と差集合はそれぞれ ∩ と ∖ です。結合順位は積集合と差集合が同列で、次いで和集合です。

code Binary operators for sets
write: to (set a) value (a ∩ b ∖ c, d ∖ e)
write: to (set b) value (a, b, c, d, e)
endcode

比較演算子は左右の区別がない = と左向きの <, ≤, ⊂ がありますが、 右向きのものは用意されていません。

code Relational operators
if 10 < 20 ∧ 20 < 30
if 100 = 100 ∧ ¬ 100 = 200
  if (a, b) ⊂ (a, b, c)
   print: ⟨relational operators⟩ ↵
endcode

論理演算は論理和、論理積、論理否定の 3 種類です。論理和と論理積の記号はそれぞれ ∨ と ∧ で、論理否定の記号は ¬ と ⊥ の 2 種類があります。結合順位は ¬, ∧, ∨, ⊥ の順です。¬ と ⊥ は意味は同じですが結合順位が異なります。

code Boolean operators
if ⊥ false ∧ true ∨ ¬ true ∧ true
 print: ⟨boolean operators⟩ ↵
endcode

演算子の総合的な結合順位は算術演算、集合演算、比較演算、論理演算の順です。パーレン (...) を使うと演算の結合を変えることができます。

名前

パステルステッチの「名前」は固有名と姓の組です。固有名と姓に使用できる文字は、英語のアルファベットの大文字 (A から Z)、小文字 (a から z) と算用数字 (0 から 9) です。また、固有名と姓にはそれぞれ半角スペースを混ぜることができますが、この半角スペースは無視されます。

code White spaces
write: to (ninety fourty five) value (1945)
print: [ninety fourty five], ↵
endcode

姓は固有名の直後に上付き文字として記載します。

code Family names
write: to (garnet tillalexandros 17th) value (16)
print: [garnet tillalexandros 17th], ↵
endcode

姓を省略した場合、または、固有名の直前または直後に姓を表す記号を付けた場合は、name 命令で指定した姓が使われます。姓を表す記号は、ナンバーサイン、ドル、アットマーク、アポストロフィー (#, $, @, ') の 4 種類を使用できます。name と姓から成る行は、姓を省略した場合の姓を指定します。name、姓を表す記号、姓の順に記述された行は、姓を表す記号を付けた場合の姓を指定します。

name 命令の有効範囲は、その name 命令から、次の name 命令または endcode までの間です。有効な name 命令がない場合、姓を省略したときの姓は main になります。また、有効な name 命令がない場合、姓を表す記号 #, $, @, ' に対応する姓はそれぞれ argument, tentative argument, continuation argument, argument symbol です。

code Family name shortcuts
name family name 1
name # family name 2
name $ family name 3
name @ family name 4
name ' family name 5
endcode

演算子をブレース {...} で囲むと、その演算子に対応する名前になります。これらの名前の姓は main です。演算子と名前の対応を以下の表に示します。

演算子名前
{+}plus
{−}minus
{∗}multiply
{/}divide
{∩}intersection
{∖}set minus
{,}union
{⇓}convert
{=}equal
{<}less
{≤}less or equal
{⊂}subset
{∈}type
{∧}and
{∨}or
{¬}not

文字列定数

文字列定数は 1 個以上の文字列素を続けて書いたものです。文字列定数を構成する文字列素と文字列素の間には、半角スペース、または行継続記号で無効化された改行があってもかまいません。

文字列素は ⟨ と ⟩ で囲まれた文字列です。ASCII の半角スペース (16 進法で 20) と可視文字 (同 21 から 7E)、および UTF-8 のマルチバイト文字が使用できます。それとは別に、記号 ↵ と → は、これら自体が文字列素です。これらの記号はそれぞれ、改行 (ASCII コードは 16 進法で 0A) と水平タブ (同 09) を意味します。また、アンダースコアーに続けて ASCII の可視文字または半角スペースを 1 字書くと、その 1 字から成る文字列素を意味します。

code Strings
print: _[_^___^_]_p_ _(_-___-_)_b
print: ⟨a⟩ → ⟨b⟩ → ⟨c⟩ ↵
print: ⟨aa⟩ → ⟨bb⟩ → ⟨cc⟩ ↵
endcode

浮動小数点数

浮動小数点数は (float ...) のように書きます。浮動小数点の記述には、パーレンを除く任意の文字を使用できます。

code Floating point numbers
print: (float 3.14) + (float 1.5e+2), ↵
endcode

代用表記

これまでの説明では、codeif などを太字で書き、また、∧ や ↵ などの記号を使ってきました。しかし、このような表現は実際のプログラミングでは不便なため、実際のプログラミングでは ASCII で表現できる形式を使います。これを代用表記と呼びます。プログラムのコードは原則として ASCII の文字で書きますが、文字列定数は UTF-8 のマルチバイト文字を使用できます。

代用表記を以下の表に示します。

ブロック

表示代用表記意味
code ^code コードの開始
endcode ^endcode コードの終了
if ^if 条件分岐
loop ^loop ループ
procedure ^procedure サブルーチンの定義
mulde ^mulde サブルーチンの定義と実行
initialize ^initialize イニシャライズ実行
continuation ^continuation コンティニュエーションの作成
end ^end ブロックの終了

演算子

表示代用表記意味結合順位
* 積算 1
+ + 加算 2
- 減算 2
/ / 除算 3
^intersection 積集合 4
^setminus 差集合 4
, , 和集合 5
^convert 型変換 6
= = 等しい 7
< < 小なり 7
^le 小なりまたは等しい 7
^subset 部分集合 7
^type 型判定 7
¬ ^not 論理否定 8
^and 論理積 9
^or 論理和 10
^unless 論理否定 11

文字列素

表示代用表記意味
⟨文字列素⟩ ^[文字列素] 文字列素
^! 改行
^& 水平タブ

その他

表示代用表記意味
name ^name 姓の指定
family name ^(family name)
(float 3.14) (^float 3.14) 浮動小数点数