はじめに
この記事はだいぶ前(2012年)にココログの「キリーの日本語プログラミング」に掲載したコラムですが、再編集してこちらにも投稿します。今となっては古い話ではありますが、OSによってプログラム言語(AndroidではJava)が決め打ちされている環境で規定と異なるもの(Mind)を走らせたことの記録としてお読みください。
レイアウト系
レイアウトやビューなど表示のごく基本のところをまとめておく。
Javaのオブジェクト指向のコードをMindのコードにどうやって対応させるかが問題だった。
まずレイアウト系のオブジェクトの扱いだが、たとえばJavaでは、
layout1 = new LinearLayout( this );
などと書いて「layout1」という名前のリニアレイアウトのインスタンスを作るが、このオブジェクト(Java内部ではポインタ?)をMindへ渡されても何も使い道が無い。さらには、Javaレベルの「layout1」なる名前もまたMind側からは見えない/見たくないものである。そもそもMindでプログラムを書くのだから名前はすべてMind側で(たとえば適当な日本語名で)決めるべきものである。
結果として以下のようにした。
まずMindでは次のように書く。
レイアウトは 変数と 等価。
○○とは
_レイアウトは レイアウト
~略~
リニアレイアウトを生成し _レイアウトに 入れ
(注:変数名の頭にアンダースコアを付けるのはMindのルールではなく単に筆者の好みである。局所変数と大域変数とで区別がつきやすいようにしている)
まず、Mindで「リニアレイアウトを生成」という処理単語を使い、リニアレイアウトのインスタンスを作る。正確には「インスタンスを作ることをJavaに要求するる」である。
インスタンスを作るとは言ってもMind側では「なんちゃって」であり、単に1から始まる整数(通し番号)を生成するだけである。
処理単語「リニアレイアウトを生成」は例えば「1番でインスタンスを作ってね」をJavaに要求する。
これに対応するJava側記述を次のようにする(要所のみ抽出)。
// Layoutをアサインする //
public int j_assignLayout( int seqno )
{
linearLayouts[seqno] = new LinearLayout( this );
~略~
}
Javaではリニアレイアウトのインスタンスを生成し、Mindから渡された通し番号(上記で"seqno")を添え字とした配列に格納する。先に書いたようにJava側で個別インスタンスに名前を付けても使い道が無いが配列要素は無名なのでちょうど良い。
上記により、最初に生成されたリニアレイアウトは「1番目のリニアレイアウト」として以降操作可能となる。
ビューについて
ビューについても同様で以下のようにした。
Mindでは次のように書く。
ビューは 変数と 等価。
○○とは
_案内文は ビュー
~略~
テキストビューを生成し _案内文に 入れ
Mind側ではレイアウトの時と同様、「テキストビューを生成」によって通し番号を生成しその番号で管理する。
注1:実際には、テキストビューのほかにボタンやチェックボックスなど他のビュータイプも一括して操作できるように、タイプ+通し番号で管理している
注2:先に書いたレイアウトも実は同様で、複数のレイアウトをタイプ+番号で識別している
Java側は次のような記述に対応する。
// Viewをアサインする //
public int j_assignView( int seqno )
{
textViews[seqno] = new TextView( this );
~略~
}
レイアウトとテキストビューをそれぞれ1つ扱うMindのプログラムは次のようになる。
メインとは
_レイアウトは レイアウト
_案内文は ビュー
(レイアウト)
リニアレイアウトを生成し _レイアウトに 入れ
垂直を _レイアウトに 子の追加方向を設定し
_レイアウトを レイアウトをアクティビティに追加し
(ビュー)
テキストビューを生成し _案内文に 入れ
18を _案内文に 文字のサイズを設定し
「こんにちは」を _案内文に 文字を設定し
_案内文を _レイアウトに ビューを追加し
。
つづく
最近、Mindユーザーの@mylifewithviolinさんがMindコンパイラの内部に興味を持たれているようなので参考情報として投稿してみました。本記事はしばらくつづきます。次は(ステップ4/9)。