値の変換
SenseTalkはタイプレス
言語です。つまり、すべての値を テキストとして扱うことができ、特定のタイプの値、例えば数字や日付やテキスト、または値のリストを保持する変数を宣言する必要はありません。ただし、内部的にはSenseTalkは異なる形式の値を保持し、必要に応じて一つの表現形式から別の表現形式に変換できます。
これらの変換がいつどのように行われるか、そしてフォーマットを制御するグローバルプロパティを理解することで、必要に応じてこのプロセスを制御することができます。
自動変換
SenseTalkは、必要に応じて値を適切な内部表現形式に自動的に変換します。例えば、加算といった算術演算を行う際には、加算される二つの値は数値として評価されます。その結果の値は、テキストとして必要になるまで内部的に数値形式で保持されます。
ほとんどの場合、SenseTalkの自動値変換はあなたが求める結果を提供します。しかし、時折予期せぬ結果が生じることもあるため、これらの変換がいつ行われ、どのように制御できるかを理解することは有用です。以下の例を考えてみましょう。
put ((1 + 2) & 4) + 5
この文が実行されると、まずSenseTalkは数値1と2を加算し、値3を得て、一時的に数値として保存します。次に行われる操作は、この値と4を連結することです。これはテキスト操作なので、両方の値は一つのテキスト文字列に結合される前にテキスト表現に変換されます。最後に、この結果は数値5を加算するために数値に戻されます。
最終的な結果表示は39になるでしょう。それとも?実際の結果は39か、309か、3009か、それとも他の数値か、あるいはこの文が実行された時のthe numberFormat
プロパティの設定によってはエラーになるかもしれません。どのようにしてこれが起こるか見てみましょう。
the numberFormat
プロパティは(Values Global and Local Propertiesで詳しく説明されています)、数値がテキスト表現に変換されるときのフォーマットを制御します。これには、表示する小数点以下の桁数や、先頭に0を表示するかどうかなどが含まれます。例えば、数値3と4は、それらを連結するためにテキスト形式に変換されました。numberFormat
プロパティのデフォルト設定は、それらをテキスト文字列 "3"と"4"に変換し、連結テキスト "34"を生成します。先頭に0を含むnumberFormat
を使用すると(例えば"00"に設定すると)、数値3と4はテキスト形式で"03"と"04"になり、"0304"と連結します。この文字列に5を加えるために、それは数値(304)に変換され、最終結果は309となります。
同様の変換は、日付や時刻の値、または値のリストやプロパティリスト全体がテキスト形式で必要とされるときに、内部的に保持されている値に対して行われます。
バイナリデータの変換
データは、ファイルにアクセスする際にas data
を指定することで、"raw"データのバイトを含むバイナリ形式でファイルから読み込むことができます。
put file "/tmp/aFile" as data into dataBytes
一部の操作、例えばデータからバイト範囲を抽出するなどの操作は、データをその生の形式で使用します。
put bytes 1 to 4 of dataBytes into firstBytes
他の操作、例えばその値を表示するなどは、データを自動的にテキストに変換します。バイナリデータとテキストの間で変換するときには、the defaultStringEncoding
が使用されてデータを文字として解釈するか、または(逆方向に)テキストの文字をデータとしてエンコードします。