3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

日本語プログラミング言語Mindでのスタックプログラミングの基本のキについて説明したいと思います。

対象読者

日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

Mindのスタックプログラミングの基本のキ

Mindは、後置記法(逆ポーランド記法)1を採用したスタックベースのコンパイラ型プログラミング言語です。スタックベースのプログラミング言語の例としてはForthがあります。

単語の定義

Mindではすべてのデータはスタックに積まれ、コンパイラや実行処理系はスペースで区切られた単語(処理単語の他、定数、変数も含む)を順次処理します。引数や返り値もスタック上で管理されます。例外として中置記法による代入構文や関数形式もサポートされていますが、本記事では後置記法による記述についてのみ説明します。

処理単語の定義

ユーザーが処理単語をなにも定義していない場合は、予約済の処理単語を使って処理単語を定義していくことになります。

処理単語名に接続したひらがなの「は」または「とは」が定義用のトークンとなり、その直前の文言を処理単語名としてコンパイラが認識します。句点の「。」が定義のためのブロック文の終端となります。空白で区切って単語を句点まで列挙します。

処理単語名は 〇〇 ◇◇ △△。
処理単語名とは 
    〇〇 ◇◇ 
    △△。

上記の「〇〇」や「◇◇」、「△△」は処理単語であっても定数、変数であってもかまいません。句点の「。」までが処理単語の定義範囲となりますので、改行やインデントは自由にできます。

「〇〇」や「◇◇」、「△△」がスタックに対してどのような処理をする単語であるかが重要で、「〇〇」と「◇◇」がスタックに1つづつデータを置き、「△△」がスタックから2つデータを拾っている場合は、後置記法によるロジック定義として成立します。

Mindコンパイラは一部のトークン扱いのひらがなを除き、漢字の途中や末尾のひらがなは無視する2という特徴を持っています。従って、プログラムのソースコードを日本語として読みやすくするために、下記のようにひらがなを追記してもコンパイル結果や実行結果に変化はありません。

処理単語名するとは 
    〇〇と ◇◇で 
    △△すること。

※△△が、引き算や割り算のような処理単語の場合、〇〇と◇◇の順序が逆でも同じ結果を保証する送り仮名の逆転介入3という仕様がありますが、ここでは割愛します。

ユーザーが定義した処理単語は定義ヶ所より後方で引用することができます。(「仮定義」という宣言をすることで前方に処理単語名だけ宣言しておくこともできます。)

定数の定義

定数名に接続したひらがなの「は」または「とは」の後に、空白で区切って「定数」というトークンを記述し、空白で区切って値を記述し、その後に句点を置きます。

定数名は 定数 NN。

※NNは数字のこと。

文字列定数名とは 文字列定数 「あい」。

定数型には数値系の定数と文字列系定数があります。定義開始トークンの「は」または「とは」はどちらでも使えます。文字列リテラルの区切りにはかぎかっこ「」の他にもダブルクォート” ”などいくつか使えます。

定数をスタックに置く処理単語の定義

下記のように書くこともでき、定義開始トークンの「は」または「とは」の後に「定数」「文字列定数」の記述がない場合は、数値、文字列をスタックに置く「処理単語」となります。

処理単語名は NN。

※NNは数字のこと。

処理単語名2とは 「あい」。

変数の定義

変数名は 変数。
文字列変数名とは 文字列。

変数型には整数系、小数系、文字列系の変数があります。定義開始トークンの「は」または「とは」はどの型でも使えます。

※文字列系の変数にはいくつかのタイプがありますが、本記事では割愛します。

※処理単語の詳しい定義方法で、処理単語が記述された際のスタックトップに置かれているデータのタイプを指定しておくことができます。4この場合は、タイプの異なるデータをスタックから拾おうとした記述に対してコンパイラがエラーチェックします。

メインの定義

アプリケーションの実行開始エントリとして「メイン」を定義する必要があります。インタプリタ環境はで「メイン」がなくても実行できますが、コンパイルされたアプリケーションとして実行する場合は「メイン」の定義が必要となります。

メインとは 
    〇〇 ◇◇ 
    △△。

制御構文

条件分岐

下記は条件分岐を定義しているようすです。「ならば」と「つぎに」を使います。

        現在の要素番号が 段ボール箱の要素数より 大きい
        ならば 打ち切り
        つぎに

基本形は下記のような構文となります。条件では真(1)または偽(0)が返る単語または比較文を記述します。条件で真(1)が返る場合に

条件
ならば 処理1
つぎに

処理は「つぎに」が出現するまで記述できます。改行しても影響はありません。「つぎに」は「つぎ」でも可。

下記は条件文の真偽(1または0)が偽(0)の場合に処理させる場合です。「でなければ」を使います。

        開始要素番号と 最小値要素番号が 等しい?
        でなければ
            一時退避のボール数に 段ボール箱(開始要素番号)を 入れ
            段ボール箱(開始要素番号)に 段ボール箱(最小値要素番号)を 入れ
            段ボール箱(最小値要素番号)に 一時退避のボール数を 入れ
        つぎに

基本形は下記のような構文となります。

条件
でなければ 処理2
つぎに

※上記の記述例で「段ボール箱」という単語に中かっこ( )で番号を指定しているのは下記のように定義した配列です。

段ボール箱は 15の 変数。

下記は他のプログラミング言語のif ~ else ~ に相当する構文です。

変数名1が 変数名2に 等しい
ならば 〇〇 ◇◇ △△
さもなければ ◎◎ ◆◆ ▲▲
つぎに

基本形は下記のような構文となります。

条件
ならば 処理1
さもなければ 処理2
つぎに

他にもケース文のような多分岐構文もありますが、割愛します。

反復

単純反復

反復する記述例です。打ち切り条件は前記条件分岐を使って記述します。「打ち切り」はループを脱出する予約語です。

    ここから
        現在の要素番号が 段ボール箱の要素数より 大きい
        ならば 打ち切り
        つぎに
        段ボール箱(暫定最小値要素番号)が 段ボール箱(現在の要素番号)より 大きい
        ならば 暫定最小値要素番号に 現在の要素番号を 入れ
        つぎに
        現在の要素番号を 一つ増加し
    繰り返す

基本形は下記のような構文となります。

ここから
 処理
繰り返す

「打ち切り」は「打切」で、「繰り返す」は「繰返」でも可。ひらがなはトークン扱いの例外を除いて基本的に無視されます。

回数指定

回数を指定して反復する記述例です。

    段ボール箱の 要素数で 回数指定し
        回数を 二桁で数値表示し 「 」を 表示し
    繰り返す

基本形は下記のような構文となります。

NN 回数指定
 処理
繰り返す

「回数指定し」は「回数指定」、「繰り返す」は「繰返」でも可。ひらがなはトークン扱いの例外を除いて基本的に無視されます。

処理単語内のローカル変数の定義

処理単語内のローカル変数は、処理単語名の定義開始トークンの「は」または「とは」の後に宣言します。

処理単語名とは 
        変数名1は 変数
        変数名2とは 変数
    〇〇 ◇◇ 
    △△。

通常は上記のように改行してインデントさせますが、それは読みさすさのための配慮で、下記のように定義開始トークンの「は」または「とは」の直後で空白で区切れば改行しなくてもコンパイルは通過します。

処理単語名とは 変数名1は 変数 変数名2とは 変数
    〇〇 ◇◇ 
    △△。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。ご紹介した構文を実際に実行している様子はこちらの記事をご参照ください。

Mind(マインド)

プログラミング言語Mind(マインド)は自然な日本語で記述できるスタック指向の軽量中間コードコンパイラ言語です。逆ポーランド記法で分かち書きされた日本語単語の語順が自然と日本語の語順となるという意味の「自然さ」で書くことができます。

Mind(マインド)の入手方法

無償版のMind version 8 (windows版linux版)を下記の公式サイトからダウンロードできます。

  1. 演算子を被演算子の中間に記述する中置記法 1 + 2、前に記述する前置記法(ポーランド記法)+ 1 2、後に記述する後置記法(逆ポーランド記法)1 2 +がある。日本語は1と 2を 足す。

  2. Mindのひらがなの扱いについてはこちらの記事を参照してください。
    日本語プログラミング言語Mindの小技 「送り仮名」~形式言語としての日本語2~

  3. Mindのひらがなの逆転介入についてはこちらの記事を参照してください。
    日本語プログラミング言語Mindの小技 「逆転介入」~計算式日本語表現の語順への逆転介入~

  4. Mindのスタック属性についてはこちらの記事を参照してください。
    日本語プログラミング言語Mindの小技 「処理単語 .J」~文字列実体情報を得る~

3
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?