単位を持つ数字の利用
SenseTalkでは、数字にインチやドルなどの単位を関連付けて、意味や関連性を持たせることができます。このような値を使用して変数への割り当てを行う場合や計算を実行する場合において、その単位は必要に応じて保持または変換されます。
単位の扱い
数値を単位と共に指定するには、値の後で単位名を使用します。(以下で説明するように、本ルールの例外にドル記号$があります。)SenseTalkでは、単数、複数および短縮形の単位名のほかに、面積と体積に対して「square」と「cubic」修飾子も利用できます。
put 3 ft -- 「3フィート」
set weight to four grams
put 9 sq in -- 「9平方インチ」
注:短縮形の単位にピリオドを付ける必要はありません。
ある値の後に別の値を続けるか、andで連結させて、同じ種類の値を連続して使用することができます。このような表現は、通常、重さや距離の測定に使用されます。
put 6 ft 3 in -- 「6.25フィート」
set weight to 2 pounds and 3 ounces
上記の例で示したように、式の中で複数の単位を使用できます。割り当てや計算において、単位は必要に応じて保持または変換されます。
put 3 ft into width
add 1 yard to width
-- 1ヤードが自動的に3フィートに変換されます
put width -- 「6フィート」
put width * 4 feet into area
put area -- 「24平方フィート」
add 2 liters to area
-- 単位の不一致による例外が投げられます
複数の単位を組み合わせて、速度(時間間隔当たりの距離)や体積(長さ×幅×深さ)などの複雑な単位を作成できます。
set speed to 25 mi/hr
put speed -- 「25マイル毎時」
put 3 hrs 45 min * speed -- 「93.75マイル」
set accelerationOfGravity to 32 ft/s^2
set flow to 5 gallons per minute
set clickRate to 500/hr
set price to $5.96 per lb
-- 5.96 dollars per poundと同じ
set weight to 4 oz
put price * weight -- 「1.49ドル」
単位の互換性に関する注意点
SenseTalkでは、それが意味をなす場合は、単位を変換させて値を結合します(3フィートと1ヤードを組み合わせて6フィートとする場合など)。ただし、論理的に結合できない単位を組み合わせようとすると(平坦な面積測定と体積測定の組み合わせなど)、エラーが発生します。
加算、減算、または比較を行う場合は、単位は互換可能である(同じ測定タイプを表す)必要があります。例えば、長さの単位は、各単位の種類が異なる場合でも、別の長さの単位に足すことができます(メートル+フィート+インチでも可)。これらのタイプは、互換可能と言えます。
ただし、互換性のない単位で加算、減算または比較を実行しようとすると、例外が投げられます。
put average(4 in, 5 ft, 1 meter) -- 0.8752 メートル
put average(4 in, 5 ft, 1 pint) -- 例外が投げられます
単位の変換
上述したように、SenseTalkはある単位から別の単位へと、値を自動的に変換します。本機能は、算術演算を行う場合にとりわけ便利です。また、ある種類から別の種類へと、単位の変換を明示的に行うこともできます。
加算、減算
SenseTalkは、加算と減算を行う際に、各値を互換性のある単位に自動的に変換し、2つの値の等価性を比較します。加算と減算において、システム内の単位の内部順序に基づき、結果の値はある単位が別の単位よりも優先されます。
例えば、インチとセンチメートルを足す場合は、オペランドの順序に関わらず、結果の単位はセンチメートルになります。メートルとセンチメートルを足す場合は、結果の単位はメートルになります。ただし、as演算子を使用して、結果の種類を指定することができます。
put 8 inches + 3 cm
-- 8インチがセンチメートルに変換されて3センチメートルに加えられ、「23.32センチメートル」の結果が得られます
put (8 inches + 3 cm) as inches
-- 上述したように、8インチがセンチメートルに変換されて3センチメートルに加えられ、「23.32センチメートル」の結果が得られますが、出力前にインチに変換されて「9.181102インチ」の結果が得られます
単位を持つ数とプレーンな数(単位を持たない数)を加算または減算する場合は、その結果はエラーとなります。
乗算、除算
単位を持つ数の乗算や除算を行う場合、その単位が維持されるか変換されるかは、より複雑になります。プレーンな数を使用して単位を持つ数の乗算または除算を行うと、結果はその単位の種類を保持します。
set height to 20 feet
set width to 3 times height
put width -- 「60フィート」
set var1 to 2
put 10 hours / var1 -- 「5時間」
双方が単位を持つ数の除算を行う場合は、加算と同様に、互換可能な単位を持つ値が同じ単位に変換されます。ただし、その単位は結果から除外されます。
Put 4 yards divided by 2 feet
-- 「6」(4ヤードが2フィートの6つの区分に分割される)
単位を持つ数を掛ける場合は、それが互換可能な場合も互換不可な場合もその単位が維持され、複合単位が形成されます。例えば、マイルを時間で割ると両方の単位が維持され、結果として複合タイプの単位、マイル毎時が形成されます。
put 500 miles divided by 4 hours
-- 「125マイル毎時」
put 4 yard * 2 feet
-- 「24平方フィート」
put 2 liters times 2 liters
-- 「42リットル」
単位のリストを数学演算子と一緒に使用できます。乗算と除算の場合は、リストに対してただ1つのプレーン数を使用できます。加算、減算、乗算および除算の場合は、リスト内のアイテム数が一致するという条件において、単位を持つ数の複数のリストを使用できます。
put (4 oz, 2 g, 0.3 m) / 3
-- 「(1.333333オンス、0.666667グラム、0.1メートル)」
put (4 oz, 2 g, 0.3 m) + (4 oz, 2 g, 0.3 m)
-- 「(8オンス、4グラム、0.6メートル)」
put (4 oz, 2 g, 0.3 m) - (4 oz, 2 g, 0.3 m)
-- 「(0オンス、0グラム、0メートル)」
put (4 oz, 2 g, 0.3 m) * (4 oz, 2 g, 0.3 m)
-- 「(162オンス、42グラム、0.09メートル)」
put (4 oz, 2 g, 0.3 m) / (4 oz, 2 g, 0.3 m)
-- 「(1,1,1)」
範囲
範囲を指定する場合に単位を使用できます。範囲の一方の端にのみ単位を指定する場合は、もう一方の端にも同じ単位が想定されます。
put 3..7 m/s
-- 3メートル毎秒~7メートル毎秒
同様に、単位を2番目の値にのみ指定する場合は、between演算子は単位が一致すると仮定します。
put 4 cm is between 1 and 3 inches
-- True
asによる変換
値を特定の単位に変換したい場合は、as演算子を使用します。
put 5 feet as inches
-- 60インチ
put 27 grams as oz
-- 0.952397オンス
put totalWeight as kilograms
set distance to (var1 + var2) as yards
上記の最後の例では、「var1 + var2」を丸括弧で囲み、最終的な結果がヤードで表されるようにする必要があります。丸括弧を使用しない場合は(つまり、「var1 + var2 as yards」)、as演算子が+演算子よりも高い優先度を有するため、var2の値がvar1の値に足される前にヤードに変換されることになります。したがって、結果の単位はvar1の単位に応じて、ヤードまたはその他の単位となります。
Convertコマンド
convertコマンドを使用して、変数内の値を特定の単位に変換できます。変換するソース値が変数やコンテナでない場合は、結果の値は変数itに格納されます。
convert depth to fathoms-- 深さの値がファゾムで表示されます
convert 3.5 gallons to cc-- 結果はitに格納されます
注:convertコマンドは、SenseTalkにおける日付および時刻値で説明したように、日付および時間フォーマットの変換にも使用できます。
単位のプロパティ
変数のunitsプロパティに直接アクセスしたり、変更することが可能です。ただし、本メソッドでは値は変換されないことに注意してください。
set width to 6 ft
put width's units -- 「フィート」
put width -- 「6フィート」
convert width to yards
put width's units -- 「ヤード」
put width -- 「2ヤード」
set width's units to "feet"
-- これで値の単位が直接設定され、以前の単位と置き換えられます
put width's units -- 「フィート」
put width -- 「2フィート」
width's unitsプロパティは、width.unitsまたはthe units of widthとしても参照できます。単位のプロパティを直接変更しても値は変換されないため、本メソッドは注意して使用するようにしてください。
単位を持たないプレーン数の単位を設定することができます。例えば、ハンドラ内で渡されるパラメータは、その他の単位が明示的に指定されていない場合は、その単位にはメートルが想定されます。
put areaOfCircle(6 in)
-- 113.097336平方インチ
put areaOfCircle(4)
-- 50.265482平方メートル
function areaOfCircle radius
if radius.units is empty then set units of radius to "meters"
return pi * radius squared
end areaOfCircle
単位の種類
SenseTalkでは、時間間隔(日、分などの期間)、長さや距離(マイル、フィート、メートルなど)、質量や重量(グラム、オンスなど)、液量(リットル、ガロンなど)、回転と角度(度、ラジアンなど)、電気測定(アンペア、ボルトなど)、およびその他多くの単位をサポートしています。
値の単位が特定の種類かどうかを確認するのに、is a演算子を使用して値を検証できます。
if mySize is not a length then put "size must be a length"
if amount is a weight then set calculateByWeight to true
通貨
金額を記述する一般的な方法として、値の前にドル記号($)を使用してドルの通貨金額を指定する方法があります。その他の単位と同様に、通貨は数値の後にドルやセントなどの単位名を使用することでも指定できます。
set cost to 5 dollars and 27 cents
set cost to $5.27
Unit Type関数
unitTypes()関数は、is a演算子によって認識されるすべての単位の種類名のリストを返します。いくつかの種類には、長さと距離、速度とスピードなどのシノニムが含まれます。
unitNames()関数は、有効なすべての単位名のリストを返します。リストには、単数と複数、および短縮形や接頭辞付きの名前のほかに、代替スペルが含まれる場合があります。
単位のグローバルプロパティ
SenseTalkには、単位系に影響する2つのグローバルプロパティ(the unitsEnabledとthe strictUnits)が存在します。デフォルトではどちらもtrueに設定されます。
the unitsEnabledグローバルプロパティ
the unitsEnabledグローバルプロパティは、必要に応じて単位系を無効にするのに利用できます。the unitsEnabledをfalseに設定すると、ほとんどの単位が無視されます。前バージョンとの互換性のために、期間の単位(時間、分、秒など)とデータサイズの単位(キロバイト、メガバイトなど)は、the unitsEnabledを無効にしても認識されます。その他の単位は無視されます。
the strictUnitsグローバルプロパティ
the strictUnitsグローバルプロパティは、単位系をどれほど厳格に認識するかを管理します。本プロパティをfalseに設定すると、単位演算に関して、単位系の厳格性を緩和させることができます。例えば、本プロパティをfalseに設定してプレーン数を単位付きの別の数に加えると、SenseTalkは例外を投げるのではなく、そのプレーン数を同じ単位を有する数として扱います(例:7フィート + 3 = 10フィート)。その他の演算では、単位は除外されます(例:4 エーカーから6ポンドまでの範囲を指定すると「4~6」となり、3フィート + 4ガロン = 7となります)。