FORTHと共に(2) 丸カッコはあるけど、計算の優先順位じゃねえ、何それ?

Joseph Halfmoon

前回「FORTHと共に」と重い腰を上げたところで、別件勃発、勢いを削がれてしまいました。仕切り直しの今回テーマは丸カッコっす。(と)の組ね。他の言語の多くでは ( 1 + 2 ) * 3 みたいな演算の優先順位を示す記号っす。しかしFORTHには優先順位みたいなフヤケたものはないっと!でも丸カッコは使うと。なんなんだ。

※動作確認に使用させていただいているのは gforth 0.7.3 です。ホームページが以下に。

https://www.gnu.org/software/gforth/

※以下でのマニュアルの引用は以下のPDFファイルを参照させていただいとります。

Gforth for version 0.7.0, November 2, 2008

FORTHに大文字も小文字もねえ(ふつう。。。)

前回も述べたとおり、FORTRANやLispほど年齢が上ではないものの、古代の言語に分類されても仕方ない歴史のあるFORTH言語っす。それを如実に表すのが、

ワードの定義に大文字も小文字も区別ねえ!

という1点であります。遥か半世紀前、BASIC言語を始めたとき、小文字で入力しようが、大文字で入力しようがリストを見ればみな大文字になってました。FORTHも「その時代」のお仲間です。小文字と大文字が別なお名前として認識される「その後の時代」の言語の皆さまとは一線を画すのであります。

空白文字は巨大な一歩、他の記号文字はそうでもない

ぶっちゃけたところ、FORTHにおいては以下の2つだけから世の中が成り立っているみたいデス。

    • 空白文字
    • ワード

ワードというのは、123 のような数値でも良いし、dup のような処理を行うためのワードでもよいし、空白以外は皆ワードっす。ワードを定義するのに記号文字も普通に使えてしまう(gforthではUTF文字もフツーに使えてしまうみたい、知らんけど)感じっす。よって空白文字だけが特別。

ここで空白文字は、半角空白、改行が該当していることは手元の処理系で確認できました。タブ文字もフツーに空白扱いされる「筈」なのですが、手元処理系のプロンプト(ok)後の入力行で「タブ」キーを押した場合はそうではなかったです。行編集時にはタブキーに意味があるみたい。しかしソースのテキスト上ではタブ文字は空白あつかいということだと思います。

半角スペース文字と改行が同じ「空白」として扱われるところが以下に。ピンク枠はgforthから返ってきた出力で無印部分が入力です。stackOPR00

1「と」2「を」+「足して」. 「結果を表示」すると3ね。同じことをスペースではなく、改行で区切っても同じ結果となりました。良かった。

スタック上の順番が全て、丸カッコで優先順位とかねえ

FORTHにおかれましては、計算の順番はスタック上の順番が全てです。他の言語のように丸カッコで、こっちゃが先ね、というような腰の定まらない記法は許されてません。

しかし、FORTHにも丸カッコありです。こんな感じ。

: (「コンパイラ」を呼び出すワード)に始まる上記の定義はどちらも「1を足す」だけのワード(関数みたな)を定義してます。丸カッコが登場し、一瞬、仮引数リスト的なものかと誤解しそうになりますが違います。なんと( ) で囲まれたテキストはコメントなのであります。人間様のメモ書きであって、コンパイルしてしまった後は消えておしまいになるみたい。

FORTHにはコメント記法に2つあり。

    1. バックスラッシュから行末までがコメント
    2. 丸カッコ( ) で囲まれたテキストはコメント

通常は、バックスラッシュにつづけて(バックスラッシュ文字 \ がコメント開始を指示する「ワード」なので、その後に空白が必要っす。)コメントを書くと。一方、丸カッコで括ったテキスト(当然丸カッコの前後には空白ある筈)もまたコメントである、と。

ただしFORTHにおいてのお作法(文法にはあらず)あり。丸カッコは定義したワードがスタックに及ぼす影響を記述するための「スタック効果コメント」であるそうな。以下例などは、ワードの実行前にスタックに数 n がおいてあったら、ワード実行後にスタックに n + 1がおかれる、という意味になるみたい。

( n — n+1)

なお、やってみたらばUTF文字はフツーに処理できてしまうので、「1を足す」とか日本語で書いても受け付けてくれるみたい。そういえば昔、日本語FORTHみたいな言語あったな~ なんだったけか?

FORTHと共に(1) 型チェックなんかねえ、全てはプログラマの意思のもと へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です