サンプルXFCN GetPix
ここですること:
・ToolBox 関数を使ってみる
・シンボルカードを使ってToolBox 関数を使えるようにする
・Analysis カードを見てみる
サンプルとして、グラフィックを文字列として取り込む XFCN を作ります。
(1)スクリプトを準備する
さてグラフィックを文字列として取り込むXFCNの第一弾です。
ToolBox関数を使って画面のグラフィックを読み、指定した座標が黒なら true 、白なら false を返します。
スクリプトは10行に収まりますから、デモ版(Working Model)でもコンパイルすることが出来ます。
-- CompileIt! script
function GetPix H, V
--
if ( H is "?" ) or ( paramCount() = 0 ) then -- 書式を返す
return "GetPixel( H, V ) "
end if
if H is "!" then -- コピーライトを返す
return "GetPixel( H, V ) "
end if
--
return GetPixel( H, V ) -- この GetPixel が ToolBox 関数
--
end GetPix
なんとも簡単な・・・(^^;)
引数がなにも無かったり、"?" が渡された時は書式を返し、"!" が渡された時はコピーライトを返します。Xのオヤクソクですね。
ここで使っている GetPixel() は何故か「Macintosh アプリケーションプログラミング」に載ってませんが、「インサイドマック徹底ガイド」(廃刊?)には以下のように紹介されています。
FUNCTION GetPixel( h, v:INTEGER):BOOLEAN;
これは BOOLEAN(真偽値:true か false )型の返値を返す関数で、引数は整数2つであるという意味です。
このスクリプトを CompileIt! の script カードに入力して下さい。
(2)テスト用のスタックを準備する
コンパイルする前に、テスト用のスタックを作っておきます。カードには大きめのフィールドを用意して等幅系のフォントを指定しておいて下さい。ボタンをひとつ作って、以下のスクリプトを入力します。
-- button script for GetPix test stack
on mouseUp
put "" into x
put x into cd fld 1
lock screen
choose select tool
repeat with V = 0 to 31
repeat with H = 0 to 31
put H && "," && V
if GetPix( H, V ) then put "1" after x
else put "0" after x
end repeat
put return after x
end repeat
delete last char of x
put x into cd fld 1
choose browse tool
end mouseUp
function GetPix H, V
click at H, V with commandKey
get menu "Edit"
return ("Copy Picture" is in it or "コピー ピクチュア" is in it)
end GetPix
これは指定された矩形中のグラフィックを読みとって、文字としてフィールドに書き出すスクリプトです。セレクトツール(四角いてんてん)で画面上の一点をクリック(選択)して、メニューに「コピー ピクチャア」が現れたらそこには絵(ドット)があると判断しています。
左上隅に何か絵を描いておくと、そのパターンが 1 と 0 に変換されてフィールド
に現れます。このスクリプトが正常に動くことを確認しておいて下さい。うまく表示されないようだったら、フォントやフィールドの大きさを調節してね。
(3)コンパイルする!
さあ、やっとコンパイルです。
例によってテスト用のスタックと、CompileIt! を両方開いておいて、script カードの左下にある Compile It ボタンをクリックします。インストール先を尋ねてきますので、テスト用のスタックを指定します。
コンパイルが終了すると自動的にテストスタックに移動して、メッセージボックスに "put GetPix (" という文字が現れます。メッセージボックスを無視してさっさとボタンをクリックしましょう。
おっとっと、テストスタックにあるオリジナルのスクリプトをコメントアウトするのを忘れてはいけません。GetPix ハンドラの部分を全て削除するか、command + [-]キーでコマントアウトしておきます。
(4)ToolBox 関数を登録する
んー,おかしいです。GetPix に何を渡してもブーリンではなく 1 が返って来てしまいます。なんででしょう?
そーなんです。これはシンボルの登録が済んでいないからなんです。
CompileIt! は ToolBox ルーチンの情報を Symbol カードに持っています。しかし ToolBox ルーチンは知識のない状態で不用意に使うと簡単に爆弾を誘発します。そのため、出荷状態の CompileIt! では ToolBox ルーチンを一切利用できないようにしてあります。
script カードの下の「 Analysis 」ボタン、或いは CompileIt! メニューから Analysis カードに移動してみて下さい。
カードの左下に Text CallBacks というフィールドがあり、 getpixel が表示されていますね。これは、CompileIt! が GetPixel を ToolBox 関数と認識せずに、テキストコールバックとしてハイパカに実行させているということです。CompileIt! はスクリプト中に自分の知らない(登録されていない)関数やコマンドが出てくると、それを HyperTalk としてハイパカに投げつけて来るのです。一方ハイパカも GetPixel なんて関数は知りませんから、エラーコードの 1 を返しているんですね。
「 GetPixel という ToolBox 関数を使うよ」という指示を CompileIt! にしてやらなくてはなりません。
・CompileIt! にスクリプトを入力したら、CompileIt メニューから Options を選んで Options ページに移動して下さい。
・右上に Symbol Table Index がありますので、この2行目、Useful ToolBox Commands & Functions をクリックして、Symbol カードに移動します。
・右側のフィールドに ToolBox ルーチンがずら〜〜〜っと並んでいますので、根気よくスクロールして、GetPixel を探してみて下さい。黒丸マークが付いてないですよね?
・これを直接クリックしてもいいのですが、CompileIt! に探させましょう。左のボタン群の一番上、Mark Used Names をクリックしてみて下さい。CompileIt! がスクリプトをサーチして、GetPixel に黒丸マークを付けます。
・更に、ボタン群の第2列目、Add Marked をクリックします。これで CompileIt! は GetPixel という ToolBox 関数を使えるようになります。
script カードに移動して(メニューが便利)、Compile It ボタンを押して下さい。今度はちゃんとコンパイルされたかな?
もう一度 Analysis カードに移動して、真ん中のフィールドに getpixel があることを確認して下さい。
(5)テキストコールバックてなんや
このように、CompileIt! には、知らない関数やコマンドをハイパカに実行させる機能があります。これは「テキストコールバック」と呼ばれます。例えばスタックスクリプトに on doJob というハンドラがあった場合、CompileIt! のスクリプトに doJob があれば、コンパイルしたXからこのハンドラを呼び出すことが出来るわけです。
テキストコールバックは HyperTalk そのまんまですから、コンパイルしても実効速度は速くなりません。むしろハイパカに送る文字列を生成するぶんだけ、HyperTalk よりも遅くなります。
さらにやっかいなことは、今回の例のように、登録してない ToolBox 関数を、テキストコールバックとしてハイパカに送りつけてしまうことです。これを防ぐにはコンパイル後にマメに Analysis カードをチェックするしかありません。
もしもスクリプト中で ToolBox のつもりで書いた関数が、CompileIt! によってテキストコールバックとして扱われた場合、ToolBox の正常な返値を期待している、以後のスクリプトで致命的なエラーが起こることはまず間違いありません。コンパイルが終わったらテストする前に Analysis カードをチェック。これは習慣にしましょう。
念の為に言っておきますが、テキストコールバックが全て悪いわけではありません。テキストコールバックを使うことによって、本来 HyperTalk が持っている機能をXから借用することが出来ます。ただ、ToolBox ルーチンとして書いたつもりものもが、テキストコールバックとして処理されると大変困るのです。
(6)ハイパカの日本語バグ
インストール先を『実験[GetPixel]』という名前のスタックにすると,コンパイル終了後,『実験[GetPixel]"』はどこにありますか?と聞かれてしまいます(**?
日本語版ハイパカ特有のバグですね。日本名を付けたスタックをハイパカが見つけられなかった状態です。
この現象は全角文字で名前を付けたスタックで一般的によく見られます。「○○は開けませんでした。ファイルシステムエラー」って言うアレです。アップル(ジャパン)さん、なんとかしてください(^^;)
対応策としては、インストール先のスタックの名前を半角英語に変えるしかありません。それでもどうかするとエラーが出ることがありますけどね・・・。
Next
CompileIt! Lab.
UDI's HomePage