今回は、プロデルユーザのために、プロデルで日本語らしくプログラム文を書く方法を詳しく説明したいと思います。
説明がなくてもサンプルを見れば、なんとなく使い方が分かってしまうのがプロデルの良いところですが、プロデルの文法を正しく知って、実際にプログラムを作る時に、日本語であることの魅力を生かしたプログラミングをしてもらえたら嬉しいです。
以前このブログでは、実補語と形式補語を紹介しましたが、今回も「手順呼び出し文」を主に説明していきます。過去の記事も併せてご覧ください。
プロデルの「文」とは
プロデルでの「文」とは、プログラムの処理の単位です。基本的には、文の書き始めから、改行または「。」、「~終わり」までが、ひとつの文です。
例えば、
「こんにちは」を表示する
は、1つの文です。また次のように
値は、10。値を報告する
というプログラムでは、一行に「。」で区切られた2つの文があります。
文には、手順を呼び出して実行する「手順呼び出し文」と、変数を値を入れる「代入文」、「制御文」等があります。制御文には、「もし」文や「繰り返す」文があります。
「手順呼び出し文」は、すでに定義されている手順(メソッド)を呼び出して実行するための文です。手順呼び出し文は、補語と動詞との組み合わせで書きます。
日本語らしく書くためのプロデルの仕組み
プロデルのプログラムは、自然な日本語で書けることをコンセプトにしている反面、記号で表記するプログラミング言語に比べると、入力する文が長くなりがちです。
そのため、プログラムをできるだけ短く書く仕組みがいくつか用意されています。この仕組みを覚えておくと、よりスマートに、日本語として自然なプログラムを書けます。
特殊変数「それ」
プログラムを短く書くための仕組みとして特殊な変数「それ」があります。
「それ」特殊変数は、直前に実行された手順の戻り値を表す特別な変数です。戻り値がある手順を呼び出すと、その結果が「それ」特殊変数に格納されます。
「それ」を使った例として一番よく使われるウィンドウを作るプログラムで説明します。
ウィンドウを作る それを表示する 待機
「作る」文は、戻り値として作ったオブジェクトを返します。「作る」文が実行されると、その戻り値が「それ」特殊変数に格納されます。2行目で「それ」を使うと、1行目で作ったオブジェクトを操作できます。
このように「それ」特殊変数は、変数を用意しなくても、手順の戻り値を利用できる仕組みです。
呼び出す手順が戻り値を持つかどうかは、マニュアルに書かれています。動詞の末尾に「:」が付けられているものは戻り値がある手順です。
例えば、基本の「読み込む」手順を調べると、「・・・読み込む:文字列」となっているので、戻り値として文字列を返すということが分かります。
なお、戻り値がない文の場合は、その文を実行しても「それ」が表すものは変わりません。次の例文のように「変える」文は、戻り値がないので、「それ」変数には、「作る」文の時の戻り値を持ったままとなります。
ウィンドウを作る そのタイトルを「テキストエディタ」に変える それを表示する 待機する
また、手順を式として呼び出した場合も「それ」には戻り値が格納されません。
「それ」特殊変数は、有効範囲(スコープ)ごとに格納されています。そのため戻り値が無い、別の手順を呼び出した後、呼び出し元に戻ってきても「それ」変数の内容は変化しません。
実補語の省略
プロデル1.7.1021以降「実補語の省略」については、「複文」中でのみ省略可能とする仕様へ変更します。「実補語の省略」は、複文の副作用的な言語仕様として紹介しましたが、複文で利用する他に実補語を省略することに有意義な例が少ないこと、この言語仕様に起因して意図しない挙動となる可能性が高いことから、単文では廃止させて頂きます。
「それ」特殊変数の応用として、実補語の省略機能があります。
実補語の省略機能では、戻り値がある手順を呼び出した後に、次の呼び出し文では実補語を1つだけ省略できます。実補語を省略すると、省略された実補語の助詞と「それ」特殊変数に格納された値を使って、省略された実補語を補って呼び出してくれます。
省略できる助詞(実補語)は、その手順で必ず指定する必要がある実補語に限られます。
実補語を省略した例文を紹介します。このプログラムでは、「一覧」配列から「カゲ」という文字列がある要素だけを取り出して、「☆」で一つに繋げて表示します。
一覧は、{「トカゲ」、「エリマキトカゲ」、「エリ」} 一覧から「カゲ」を取り出す 「☆」で繋げたものを表示する
2行目では、「取り出す」手順の戻り値して、{「トカゲ」、「エリマキトカゲ」}
が返されて、「それ」特殊変数に格納されます。
3行目では、「~を~で繋げる」手順を呼び出していますが、「~を」実補語を省略しています。そのため、足りない実補語を「それを」と書かれているとみなして、「繋げる」手順を呼び出しています。その結果を表示します。
文を書き連ねる複文
複文とは、文の始まりから「。」までの間に、複数の手順を呼び出して書き連ねた文です。手順呼出し文の動詞部分を連用形にして書くことで、続けて手順呼出し文を複数書けます。
例えば次のプログラムでは、複文を使わずに「一覧」配列から「カゲ」という文字列がある要素だけを取り出して、「☆」で一つに繋げて表示します。
一覧は、{「トカゲ」、「エリマキトカゲ」、「エリ」}
一覧から「カゲ」を取り出したものを「☆」で繋げたものを表示する
このプログラムでは、「取り出す」手順の結果を「繋げる」手順で受け取り、その結果をさらに「表示する」手順に渡しています。このようにいくつかの手順を呼び出す文は、「~たもの」が頻出して冗長になりがちです。
上記の例文は、複文を使って1文に書き連ねることができます。
//複文を使ったプログラム例 一覧は、{「トカゲ」、「エリマキトカゲ」、「エリ」} 一覧から「カゲ」を取り出して、それを「☆」で繋げて、それを表示する
複文は、まず通常の手順呼出し文と同じように、補語と動詞を書きます。このとき動詞を連用形で書きます。連用形で書くことで、さらに補語と動詞を書き続けられます。呼出し文の返り値は、返り値は「それ」特殊変数に代入され、次に呼び出す手順で利用できます。
さらに複文では、実補語を省略できます。実補語の省略機能では、戻り値がある手順を呼び出した後、次の呼出し文では実補語を1つだけ省略できます。実補語を省略すると、省略された実補語の助詞と「それ」特殊変数に格納された値を使って、省略された実補語を補って呼び出してくれます。
次のプログラムは、複文で実補語を省略したプログラムです。
//複文を使ったプログラム例 一覧は、{「トカゲ」、「エリマキトカゲ」、「エリ」} 一覧から「カゲ」を取り出して「☆」で繋げて表示する
複文を使うことで、手順呼出し式を2つ書いたり、変数を用意したりせず、プログラムを短く書けます。
連用形動詞の例、複文の注意点
動詞の連用形は、手順定義の動詞名をプロデルで自動的に活用したものが書けます。動詞や手順名がカタカナ語・英数字名の場合は、語尾を「して」に活用したものが書けます。
- 取得して
- 繋げて
- 区切って
- 読み込んで
- 開いて
書き繋げられる手順は返り値がある手順のみ
連用形で書き繋げられる手順は、返り値がある手順のみです。返り値がない手順を呼び出した場合には、さらに呼び出し文を書き連ねることはできません。
例えば「報告する」手順には、戻り値が無いため、次の例文のように書き続けることができず、構文エラーになります。
// 次の複文はエラーとなります 日付を報告して日付を表示する
補語は連用形動詞までにすべて使われること
連用形動詞によって、手順呼び出し文を書き続ける場合、連用形動詞の部分より前に書いた補語は動詞ですべて消費される必要があります。つまり実補語は必ず動詞よりも前にすべて書いておく必要があります。
この点については、補語のスタックが関係しますが後ほど説明します。
// 次の複文はエラーとなります 「-」で、配列から「カゲ」を取り出して、繋げて報告する // 補語は連用動詞を跨がないように書いてください 配列から「カゲ」を取り出して、「-」で繋げて報告する
話が逸れますが、例えばJavaやC#,JavaScriptにも複文に似た仕組みがあります。「;」までに複数のメソッド呼び出しをつなぎ合わせて書く”メソッドチェーン”という書き方があります。これらの言語に慣れている方には、プロデルの複文がメソッドチェーンに似た使い方だと考えると、複文が理解できるかと思います。
//メソッドチェーンの例 new Foo().bar().hoge().bar().hoge();
複文による代入
複文には、「~とする」代入文も使えます。手順呼び出し文の動詞部分を連用形にして「~とする」と書くと、~に指定した変数に手順の戻り値を代入できます。
「メモ.txt」から読み込んで内容とする それを報告する
なお「~とする」代入文の後は、さらに書き連ねられません。
このように、「それ」特殊変数や複文を使った方法や、実補語を省略する方法を覚えると、プロデルのプログラムを、簡潔でスマートに、日本語として自然なプログラムとして書けるようになります。
手順呼び出し式と補語スタック
一方で、「~したもの」を使って手順呼び出し文を式として扱う書き方があります。手順呼び出しを式で書くと、複文のように一つの文に複数の文を書けます。
複文に対応する以前のプロデルでは、式化した手順呼び出しをよく使っていました。こちらの書き方についても紹介します。
次のプログラムは、式化した呼び出し文のプログラム例です。
メモ欄の内容を「メモ.txt」から読み込んだものに変える
この文では、『メモ欄の内容を~に変える』と『「メモ.txt」から読み込んだもの』の2つの文で構成されています。文が読みやすければ、必ず[ ]や( )で囲む必要はありません。
補語スタック
プロデルでは、プログラムを解釈するときに、補語スタックを使います。スタックとは、メモリ上の特殊な箱で、情報を積み重ねるように入れて、最後に入れたものから順番に情報を取り出すことができます。プロデルには、プログラム解析中に文に現れた補語を入れておくために、補語スタックが用意されています。
プログラムの構文解析中に、補語が現れると補語スタックに、補語を入れておきます。解析を進めて、動詞が現れた際に、その動詞が必要とする補語だけをスタックから取り出します。必要な補語を取り出したら(または必要としない補語が出てきたら取り出すのをやめて)、取り出した補語を使って手順呼び出し文を作ります。
動詞の続きが「~もの」となっている場合には、その手順呼び出し文を式とみなして、助詞とともに実補語としてスタックに入れます。このような処理を続けながらプログラムを構文解析していきます。
図では、先ほどの例文を、補語と動詞に分解した図と、補語をスタックに入れる様子を示してみました。スタックには、図で表したように『メモ欄の内容を』『「メモ.txt」から』『「メモ.txt」から読み込んだものに』の順番で実補語をスタックへ入れたり出し入れして構文解析していきます。
プログラムの構文解析に補語スタックを使うのは、プロデル固有の考え方で、他のプログラミング言語にはありません。慣れるまで難しいかと思いますが、補語スタックを理解すると、プロデルがより分かるようになるかと思います。
※スタックを用いた言語ではForthが有名ですが、これは実行時にスタックを操作するのに対して、プロデルは構文解析時にスタックを用います(実行時にはスタックを用いません)。この点が異なります
補語の順番
動詞に係る実補語の助詞の順番は、決まっていません。補語は一度スタックに入れられて動詞が現れた際に、スタックに最後に入れられたものから順番に、必要な補語を取り出していきます。書きやすい・読みやすい順に助詞を書いてください。
ただし、手順呼び出し式と組み合わせた、手順呼び出し文を書く場合には、順番に注意が必要です。
OS一覧は、{「Windows」,「macOS」,「MS-DOS」,「CP/M」} Linux一覧は、{「Ubuntu」, 「CentOS」, 「Fedora」, 「FreeBSD」} OS一覧へLinux一覧から「e」を取り出したものを一括追加する OS一覧を表示する
動詞が現れた際、スタックの最後に入れられた補語から順番に取り出されます。そのため、その動詞で使われない助詞を持つ実補語が現れると、それよりも前に入れられた補語は使われません。
図のプログラムのように1番目の呼び出し文を、2番目のように異なる順番の実補語で書けます。ただ3番目に挙げた例では、「取り出した」動詞に必要な実補語(~から)が離れて書かれているために、構文エラーとなります。
実補語は、動詞や同じ動詞に係る補語と隣り合って書く必要があります。4番目の例も、それぞれの同じ動詞に係る補語が隣り合っているので正しく解釈されます。
自分のわかりやすい書き方で
補語の順番について説明しましたが、「補語スタックが難しそう」と思った時は、呼び出し分を( )や[ ]で囲ってしまうのが、簡単でわかりやすいです。
OS一覧へ[Unix一覧から「e」を取り出したもの]を一括追加する
ここまで説明してきましたが、自分のわかりやすい書き方でプログラムを書くことをおすすめします。補語スタックが難しそうと思ったら、気にせずにプログラムを書いてみましょう。知らなくてもプロデルで十分プログラミングできます。
まとめ
今回は、複数の手順呼び出し文をより日本語らしく書く方法を仕組み交えて紹介しました。
プロデルでは、より自然な日本語でプログラムが書けるような仕組みを用意しています。より良い書き方ができるように日々改良して最新のプロデルに反映させています。
実はこれまで文法の設計や実装に注力するあまり、このような文法についての説明を作成しておらず、プロデルの文法が理解しづらい状態でした。今回のようにブログ記事を通じて、説明していければと思っております。
分かりづらい説明に感じられたプロデルユーザ様もいらっしゃるかも知れませんが、今後もいろいろな形で紹介できればと思いますので、お付き合い頂ければと思います。