はじめに
Paraphrase は Forth 系であるため、現在一般的に使用されているプログラミング言語とは異なる言語文化に属しています。この文書では、Paraphrase の言語システムのうち値とワードについて説明をします。
トークン
Paraphrase の文法は単純であり、基本的に空白などホワイトスペースで区切られた文字列をトークンとして取り扱います。「基本的に」と書いたのは、ダブルクォーテーションもしくはシングルクォーテーションで囲まれた文字列に対しては、文字列中の空白で分離することはないためです。
例えば、以下のような入力は
123 "456 789" "hello world" show
Paraphrase の言語処理系によって、
123
"456 789"
"hello world"
show
という 4 つのトークンに分解されます。
一般的な言語では、空白は読みやすさの向上などに活用されます。例えば x>0 を x > 0 などと書いたりしても意味は変化しません。しかし、Paraphrase では、x>0 と x > 0 では異なった入力として解釈されます。これはトークン単位で値やワードとして解釈されるからです(ワードについては後で説明します)。x>0 という入力は、「x>0」というひとつのトークンとして解釈されますが、x > 0 という入力は「x」「>」「0」という 3 つのトークンとして解釈されます。
値
トークンは、まず、値として解釈できるか調査されます。値には、
- 整数
- 浮動小数点
- 多倍長整数
- 多倍長浮動小数点
- 文字列
- シンボル
があります。これらの値として解釈できるトークンであると解釈されると、値として取り扱われます。入力された値をどのように取り扱うかは、処理系のモードにより変化します。モードについては別の文書で詳しく説明したく思いますが、起動直後はインタプリタモードとなっています。このモードでは、入力された値はデータスタックに積まれます。例えば、1 2 3 と入力すると、スタックの様子は次のようになります:
+-----+
TOS-->| 3 |
| 2 |
| 1 |
DS:--------------
上の図は、スタックの様子を示したものです。TOS というのは Top Of Stack の略でスタックの一番上の値を指します。スタックから値を取り出す場合は、原則的には、この TOS で示されている値から順次下向きに取り出されていきます。DS は Data Stack の略です。
数値に対する接頭詞と接尾詞
整数に関しては、int, long, big-ing が存在します。10 進数と解釈され、かつ、浮動小数点を表すピリオドが含まれない場合は整数として解釈を試みます。基本的には int 型(符号あり 32 ビット整数)として格納されますが、それに収まりきらない場合は long(符号あり 64 ビット整数)としての解釈を試み、それでも収まらない場合は big-int として解釈されます。
しかし、場合によっては long 型の 1 や big-int 型の 0 を入力したい場合があります。型変換を用いることもできますが、接尾詞を用いると直接これらの値を入力できます。数字列の最後に小文字または大文字の L (エル)を付けると long 型の整数値であることを示します。同様に LL という接尾詞を付けると big-int 型の値であることを示します(show というのは現在のスタックの様子を表示するワードです):
> 1L 0LL show
+----------+
TOS-->| bigInt 0 |
| long 1 |
DS:------------------
ok.
>
浮動小数点においても同様で、接尾詞 f または d を用いると、それぞれ float(32 ビット浮動小数点値)および double(64 ビット浮動小数点値)を表します。注意する点としては、これらの接尾詞は小文字である必要があります。
> 1.0f 1.0d show
+-----------------+
TOS-->| double 1.000000 |
| float 1.000000 |
DS:-------------------------
ok.
>
最後は 16 進数を示す接頭詞 0x です。C 等でで使われる方法ですが、Paraphrase でも使用可能です:
> 0xFF show
+---------+
TOS-->| int 255 |
DS:-----------------
ok.
>
ワード
値以外のトークン=値として解釈されないトークンは、ワード名の候補として解釈されます。ワードは他の言語における関数やサブルーチンのようなものです。Paraphrase は Forth と同様、+ という記号は演算子ではなく、+ というワードです。このワードはスタック上にある 2 つの値を取り出し、それらの和をスタックに積むワードです。例えば、インタプリタモードにて
> 2 3 +
と入力すると(注:左端の「>」はプロンプトですので入力の必要はありません)、
+-----+
TOS-->| 3 | ワード + を実行すると… +-----+
| 2 | ---> TOS-->| 5 |
DS:------------- DS:-------------
となり、スタック上に 2+3 の計算結果である 5 が積まれている状態となります。
ワードは、必ずしもスタックに変化を与えるとは限りません。これは、他のプログラム言語において、引数を必要としない関数や戻り値を返さない関数が存在するのと同様です。スタック上の値を必要としないワードや、スタックに何も積まないワードも存在します。
このように、他の言語ではキーワードや演算子として取り扱われているものもワードとして準備されているのが Forth 系の特徴です(Lisp みたいですね)。
ワード(単語)は「辞書」と呼ばれるデータベースに格納されており、原則として、ワード名が入力されると、同名のワードがユーザー辞書に存在するかを調査し、見つからない場合はエラーとして報告します。