値の変換
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
が使用されてデータを文字として解釈するか、または(逆方向に)テキストの文字をデータとしてエンコードします。
明示的な変換
the numberFormat
のようなプロパティは、値がテキストに変換される際にどの形式を取るかを制御しますが、その変換がいつ起こるかは制御しません。次の短いスクリプトを見てみましょう:
set amount1 to 33
set amount2 to 44
set the numberFormat to "0.00"
put amount1 + amount2 into total
displayOutput total-- the numberFormat doesn't get applied here
displayOutput total as text-- getting total as text forces the numberFormat to be applied here
to displayOutput of something
put "The value is: " & something
end displayOutput
もし、total
をdisplayOutput
コマンドに二つの小 数点でフォーマットされた形で渡すつもりであれば、上記の最初のdisplayOutput
の呼び出しは失敗します。問題は、total
が内部的には数値として表現され、その形でdisplayOutput
に渡され、displayOutput
ハンドラのnumberFormat
がそれが最終的にどのようにフォーマットされるかを決定するからです。これらの数字がローカルのnumberFormat
設定を使用してテキストに変換されるように強制するには、as text
オペレーターを使用することができます。上記の二回目のdisplayOutput
の呼び出しに示されています。
同様に、as number
、as date
、as time
、as data
、as color
オペレーター、または関連するasText
、asNumber
、asDate
、asTime
、asData
、asColor
関数は、値がその形式で明示的に評価されるように強制するために使用することができます。
関連するグローバルプロパティ:
- The NumberFormat
- The ListFormat
- The PropertyListFormat
- The DefaultQuoteFormat
- The TimeFormat
- The UnitFormats
NumberWords
, OrdinalWords
, TimeInterval
, TimeIntervalWords
, ByteSize
, and ByteSizeWords
関数
動作: これらの関数は、数値、時間の間隔(秒)、またはファイルサイズ(バイト)を、より親しみやすい形式の単語を使用して変換します。ordinalWordsを除くこれらの関数から得られるテキストは、value()
関数(以下参照)を使用して数値に戻すことができます。
例:
put numberWords(90) -- "ninety"
例:
put numberWords(427.8) -- "four hundred twenty-seven point eight"
例:
put ordinalWords(90) -- "ninetieth"
例:
put timeInterval(90) -- "1 minute 30 seconds"
例:
put timeIntervalWords(90) -- "one minute thirty seconds"
例:
put timeIntervalWords(11520) -- "three hours twelve minutes"
例:
put byteSize(5242880) -- "5 megabytes"
例:
put byteSizeWords(90) -- "ninety bytes"
その他の値の変換
数値、リスト、プロパティリストに加えて、テキスト以外の内部表現を持つ他の値もあります。これらの内部値は必要に応じて自動的にテキストに変換されます。このセクションの前半部分で説明した値のタイプに加えて、これには日付と時刻を表す値、および色の値も含まれます。また、以前に触れなかったいくつかのフォーマット関数を使って、値を明示的に一つの形式から別の形式に変換することもできます。
色の値は内部的にバイナリ形式で表現することができます。表示やテキストへの変換時には、the colorFormat
のグローバルプロパティの現在の設定が形式を制御します。色についての詳細はSenseTalkの色の値をご覧ください。
SenseTalkの日付と時間の値は、実際の日付/時間の値とそれを必要に応じてテキストに変換するテキスト形式の両方を含む内部形式を使用して表現されることがよくあります。日付/時間の値を一つの形式から別の形式に変換するには、formattedTime
関数やconvert
コマンドを使用することができます。これにはthe timeFormat
のグローバルプロパティの設定が関与します。日付と時間についての詳細はSenseTalkの日付と時間の値をご覧ください。
merge()
関数とformat()
関数は、テキストとデータ操作に説明されている多用途の関数で、一般的なフォーマットニーズに対応できます。そのセクションで説明されているstandardFormat
関数は、任意の値をアーカイブに適したテキスト形式に変換するのに便利です。
JSONFormat
関数とJSONValue
関数を使用して、テキストデータをJSONとSenseTalkの間で変換することができます。
XMLRPCFormat
関数とXMLRPCValue
関数を使用して、テキストデータをXML-RPCとSenseTalkの間で変換することができます。