対話モード
- 注1
- 本HTMLファイルは Mind WorkBench Talk 独自の 対話モード についてのみ解説しています。対話モード以外の基本部については Mind WorkBench Talk の使い方(基本部) をお読みください。
- 注2
- 本マニュアルと同じ内容が WorkBench の「ヘルプ」ボタンでも表示できます。
恐れ入りますが、以下の挙動についてはいずれも、Mind WorkBenchが利用しているTcl/Tk(GUIモジュール)の仕様による制限ということでご了承願います。
- ●
- 対話モードを終了したとき「実行のみ」と「起動引数付き実行」の両ボタンの文字の色が本来の赤色にならずに黒色のままになりますが、マウスカーソルをかざしてボタンの上を通過させると復旧します。
- ●
- 対話モードでの即実行を繰り返しおこなっていると、まれにキャレット(テキストの入力位置)が本来の場所と違うところに飛んでしまう問題がありますが、ウィンドゥを一度閉じて再度起動していただくと直ります。
- ●
- ソース表示域およびコンパイル・実行結果の領域において、マウスのホイールによるスクロールはおこなえません。スクロールバーを動かすことでスクロールをお願いします。
- ●
- ソース表示域およびコンパイル・実行結果の領域において、文字選択→マウス右クリックで表示される編集メニュー(「コピー」など)での操作がまれに期待した通りにならないことがあります。その場合はお手数ですがキーボードショートカット(Ctrl-Cなど)をお使い願います。
1.「対話モード」に入る
メニューバーにある「対話モード」ボタンを押すことで対話モードに入ります。
以下では、ソースファイルを何も開いてない状態で対話モードに入ったケースで説明します。
(ソースファイルを開いた状態でも対話モードに入れますがそれについては後述します)

ボタンを押すと対話モードに入り、ボタンは緑色に変わります。
さらに、タイトルバーに表示されるソースファイル名が
(対話).src という特殊な名前で表示されます(一般のソースファイルと区別できるようこのような名称になっています)。
また、ソース表示域先頭にキャレットが表示され、編集可能になったことを表します。

また、ウィンドゥ下段のステータスバーにも以下のような変化があります。

上記のように、「ディレクトリ」ボタンの表示(カレントディレクトリ)が "talksource" になります。さらに「ライブラリ」ボタンの表示が "lib\fileS" になります。こられは対話モードに入る時に強制的に切り替わります。
「ディレクトリ」「ライブラリ」の二つは対話モードを終了したとき元の状態に復帰します。
2.Mindのプログラムを即実行する
試しに、ソース表示域に以下のようなコードを入力し、行末でエンターキーを押してみてください。

エンターキーを押すと同時にこのソースが即実行され、コンパイル・実行結果の領域にその様子が表示されます。

上のように、コンパイル・実行結果の領域に実行後のスタックの様子が示されます。2と3がスタックに積まれているのが分ります。
(スタックの図については、Mind Version 8 のプログラミングマニュアルの「1 Mindのしくみと特徴」−「概要」−「スタックとは」を合わせてお読みください)
現在、カーソルは「2と 3を」のすぐ下の行の左端にあるはずですが、この状態で再度エンターキーを押せばもう一度実行できます。あるいは、「2と 3を」の行の右端にカーソルを移動させてエンターキー打鍵でも構いません。
(注:エンターキーを短い間隔で連続打鍵したり押し続けたりしないでください。エラーが起きることがあります)
次に、カーソルを「2と 3を」の行末に移動させ、以下のように「加え」を追加して実行してみます。

上のように、スタックに積まれていた2と3が消え、加算が行われ、最後に5が残ったことが分ります。
3.スタック表示について
対話モードではスタック表示をうまく使うのがコツです。
通常にソースコードを書き、コンパイル・実行する従来の方法であれば、「2と 3を 加え」だけでは結果が見えないので、次のように書いていたはずです。
2と 3を 加え 数値表示する
一方、対話モードでは「加え」で終ったとしてもスタックで結果が確認できるので、「数値表示」のような「結果を出力させるための処理」は書かなくて済み簡単になり、以下のように打つだけです。
2と 3を 加え
次に、文字列をスタックに積むケースを試してみます。以下のように入力してください。
(以前の結果表示が残ってまぎらわしい場合はメニュー「表示」-「実行ウィンドゥクリア」を使うか、あるいは、ソース表示域も含めて全部クリアしたい場合は、一旦対話モードを抜けて再度対話に入ってください)

次に、カーソルを”「こんにちは」を”の行末に移動させ、以下のように「一行表示」を追加して実行してみます。

上のように、スタックに積まれていた「こんにちは」がコンソールに表示され、最後にスタックは空になったことが分ります。
ご注意
Mindでスタックに積まれているデータが数値なのか文字列なのかはデータ自身では区別できない構造になっています。
しかし、「文字列は下位32bitが非ゼロであることが多い」‥ということを利用し、この対話モードの機構では簡易的に数値と文字列を判別してスタック表示しています。あくまで簡易的な識別であるため以下の点に注意してください。
(1) 空の文字列は数値と判定され何かしらの大きな数値として表示されます
(一見するとランダムな数値のように見えます)

(2) 小数値は(下位32bitが非ゼロのため)逆に文字列として識別されてしまい、大量のノイズのような文字列が表示されます。したがって小数値は対話モードでは使わないか、あるいは即実行文の中で消費してしまうことで(たとえば結果を「小数形式で表示」する)最後にスタックに小数データを残さない工夫をしてください。
4.対話モードでの文字列入力
対話モードでも「文字列入力」(キーボードからの文字列の入力)が行えます。通常モードのときと同様に、処理単語「文字列入力」が実行されるとダイアログが表示されるのでそこから文字列の入力ができます。
次は簡単な実験です。

上記でエンターキーを押すとプログラムが先に進み、以下のような結果となります。(注:「文字数を 数値表示する」のように結果を出力させる単語を書く必要はありません)
5.多くのスタックデータとアンダーフロー
多くのデータをスタックに積むと以下のように表示されます。(スタックの奥のほうのデータの表示は省略されます)

逆に、スタックからデータを取り出しすぎた場合(プログラムミスが原因)は次のように表示されます。

上記では、スタックが空なのに「捨てる」を実行したため、スタックがアンダーフローし、その旨のエラーメッセージが表示されています。(データが一つしかないのに「加え」を実行したときもそうなります)
6.複数行の入力
ソース表示域でエンターキーを打鍵するとその行が実行されます。つまり1行を超えるソースは通常は実行できません。
複数行のソースを入力して、それらをまとめて実行したいしたいときは、たとえば、
2と[Ctrl+Enter]
3を[Ctrl+Enter]
加え[Enter]
のように、実行されたくない行の末尾を Ctrl+Enterとしてください。(Alt+Enter でも構いません)
7.定義文と即実行文を入力
たとえば、
○○とは
・・・・・・・し
・・・・・・・すること。
のような定義文を入力し、その後方で「○○する」のように即実行文を入力することで、何らかの処理単語の定義とその実行確認を同時におこなうことができます。ちょっとした実験に使うと便利です。
以下は例です。

定義文入力中はエンターキーを打鍵しても即実行には入りません
- 注
- 上記ではつい、
5の 三倍。
のように「。」を付けてしまいがちですが「。」は
付けないでください。(付けると即実行されません)
8.一般のソースファイルを開いているときの対話開始
通常のモードで、一般のソースファイルを開いているときにも対話に入れます。
たとえば下のようなソースファイルがあるとします。
"単語に分解して表示.src"
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
単語に分解して表示とは (文字列 → ・)
文字列1は 文字列
単語は 文字列
文字列1に 入れ
ここから
文字列1から 単語切り出し 単語に 入れ
単語が 空列?
ならば 打ち切り
つぎに
「単語=」を 表示し 単語を 一行表示し
繰り返すこと。
\___________________________/
上のファイルをMind WorkBench Talkで普通に開きます。ソース表示域にソースコードが表示されます。
以下のようになります。

この状態で対話モードに入り、ソース末尾に追加で即実行文を入力し、定義語の動作確認をおこないます。

このやり方は、たとえば仮に作ってみた処理単語をすぐ動作確認してみるのに使うと便利です。また最後にスタックが表示されるため、プログラムミスで生じたスタックずれもついでに発見できます。
9.即実行の仕組み
対話モードを実現するための内部の話になりますが、興味のある方はお読みください。
対話モード中で、ソース表示域の中で何らかの文字を入力し、エンターキーを押したとき、システムは即実行対象となるコードが書かれているかをまず判定します。
2
や、
2に 3を 加え
のような記述です。実はこのときシステムはさらに行をさかのぼって検査をおこなっています。
当該行の前に何も文字が無いか、あるいは有ったとしても何かの定義文であるとき(=末尾が「。」で終るブロックがある)、その行を即実行のソースコードとみなして次のことをおこないます。
まず、
メインとは
2に 3を 加え
。
というテキストを(ファイル名は "(対話).src")ソースファイルとして密かに生成します。
次にそのソースをコンパイルし、エラーが無ければ実行に入ります。この際、コンパイラが出力するメッセージなどはできるだけ伏せます。
結局は、普通にソースファイルを生成、コンパイルし、実行する‥という手順なのですが、これらを一気におこなうことと、その途中のメッセージ表示をなるべく隠す工夫がしてあり、結果的に外目には、当該行が即実行されたかのように見えるという仕組みです。
7章で説明した「定義文+即実行文」の組み合わせの場合も同様で、内部的には以下のようにコンパイルされます。
ソースウィンドウ
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
三倍とは
3を 掛けること。
5の 三倍
\___________________________/
↓最後の行末でエンターキー打鍵
密かに生成するソースコード "(対話).src"
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
三倍とは
3を 掛けること。
メインとは
5の 三倍
。
\___________________________/
なお、スタックダンプはMind WorkBench Talk自身がおこなっているのではなく、対話モードのプログラムがリンクしているライブラリである fileS の内部でスタックダンプの定義がおこなわれ、さらに、メインの実行が終ったときに自動的にスタックダンプの処理が呼び出されるようになっています。
このことから、lib\fileS というライブラリは対話モード専用であり、一般のプログラムのコンパイルには使いません。
対話モードでの即実行のために内部的に生成したソースファイル (対話).src は talksource\ というディレクトリに格納されているので、後から見ることができます。また1回の実行ごとにファイル名を変えてシフトし、過去8回の実行分までソースを保存しています。

以上。