単位付き数字の使用
SenseTalkでは、多くの種類の操作と比較のために、数字を数字またはテキストとして使用できます。数字は、抽象的な値ではなく、特定の種類の数量をよく表します。例えば、長方形の面積は「9平方インチ」と参照されたり、口座残高は$698.53を含んでいることがあります。
SenseTalkは、インチやドルなどの単位タイプを数字と関連付けることで、意味と関連性を加えます。変数への代入とそれらの値を使用した計算は、必要に応じて単位を維持および変換します。
単位の取り扱い
単位タイプ付きの数値を指定するには、値の後に単位名を含めます。(この規則の例外は、以下に説明するドル記号 — $ — です。)SenseTalkは、単数形、複数形、略語の単位名、および面積と体積の「平方」と「立方」修飾子を認識します:
put 3 ft -- プリント:"3 feet"
set weight to four grams
put 9 sq in -- プリント:"9 square inches"
注:単位の省略形にはピリオドを含めません。
同じタイプの値のチェーンを使用できます。1つの値の後に別の値を置いたり、and
で値を結合したりします。このような表現は、体重や距離の測定に一般的に使用されます:
put 6 ft 3 in -- プリント:"6.25 feet"
set weight to 2 pounds and 3 ounces
put weight -- プリント:"2.1875 pounds"
上記の例から見ると、あなたは表現の中で単位を混在させることができます。単位は、代入と計算で必要に応じて保持または変換されます:
put 3 ft into width
add 1 yard to width-- 1 yardは自動的に3 ftに変換され、既存の幅に加えることができます
put width -- プリント:"6 feet"
put width * 4 feet into area
put area -- プリント:"24 square feet"
add 2 liters to area -- ミスマッチした単位の例外をスローします
速度(距離/時間)や体積(長さx幅x深さ)などの複雑な単位タイプを形成するために単位を組み合わせることができます:
set speed to 25 mi/hr
put speed -- プリント:"25 miles per hour"
put 3 hrs 45 min * speed -- プリント:"93.75 miles"
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 -- same as: 5.96 dollars per pound
set weight to 4 oz
put price * weight -- プリント:"$1.49"
単位の互換性についての注意
SenseTalkは、それが意味をなす場合(3フィートと1ヤードを組み合わせて6フィートを得るなど)に単位を変換して値を組み合わせます。ただし、論理的に組み合わせることができない単位(フラットな面積測定と体積測定など)を組み合わせようとすると、エラーが発生します。
単位は互換性がある(同じ種類の測定を表す)必要があります。つまり、長さの単位(例えば)は、他の長さの単位に加えることができます。具体的な単位のタイプが異なっても(メートル+フィート+インチ=OK!)これらのタイプは互換性があると言われています。
ただし、互換性のない単位との加算、減算、または比較を試みると例外がスローされます:
put average(4 in, 5 ft, 1 meter) --> 0.8752 meters
put average(4 in, 5 ft, 1 pint) -- throws an exception because of differing unit types
単位の変換
上記の通り、SenseTalkは自動的に値を一つの単位タイプから別の単位タイプに変換します。この能力は数学的な操作に特に便利です。また、明示的に単位を一つのタイプから別のタイプに変換することも可能です。
加算、減算
SenseTalkは加算や減算の操作、そして二つの値の等価性を比較するために値を互換性のある単位に自動的に変換します。加算や減算の場合、結果の値はシステム内の 単位の内部順序に基づいて一つの単位タイプを別の単位タイプよりも優先します。
例えば、インチとセンチメートルを加えると、操作数の順序に関係なく結果はセンチメートルで出力されます。メートルとセンチメートルを加えると、結果はメートルです。ただし、as
演算子を使って結果タイプを指定することも可能です:
put 8 inches + 3 cm -- 8 inches をセンチメートルに変換し、それに3センチメートルを加える
-- なので出力:"23.32センチメートル"
put (8 inches + 3 cm) as inches -- 上記と同じだが、出力前にインチに変換する
-- なので出力:"9.181102インチ"
単位タイプを持つ数とプレーンな数(つまり、単位タイプのない数)の加算または減算はエラーとなります。
#multiply-divide
単位を使って乗算や除算をすると、単位が保持されるか変換されるかは少し複雑です。プレーンな数を使って単位付きの数を乗算または除算すると、結果は単位タイプを保持します:
set height to 20 feet
set width to 3 times height
put width --> 60 feet
set var1 to 2
put 10 hours / var1 --> 5 hours
両方の数に単位が含まれている場合の除算では、互換性のある単位タイプの値は加算と同じく同じ単位に変換されます。ただし、結果からは単位が削除されます:
Put 4 yards divided by 2 feet -- Prints: "6" (4 yards can be divided into6つの2フィートのセグメントに分けることができます)
単位付きの数が乗算されると、互換性があるかどうかに関わらず、単位が保持され、複合単位タイプが形成されます。例えば、マイルを時間で除算すると、両方の単位が保持され、複合単位タイプのマイル毎時の値が得られます:
put 500 miles divided by 4 hours --> 125 miles per hour
put 4 yard * 2 feet --> 24 square feet
put 2 liters times 2 liters --> 4 liters^2
数学的な演算子を使って単位のリストを使用することができます。乗算と除算では、リストに対して単一のプレーンな数を使用することができます。加算、減算、乗算、除算では、リストの数が一致していれば、単位付きの数の複数のリストを使用することができます:
put [4 oz, 2 g, 0.3 m] / 3 --> [1.333333 ounces,0.666667 grams,0.1 meters]
put [4 oz, 2 g, 0.3 m] + [4 oz, 2 g, 0.3 m] --> [8 ounces,4 grams,0.6 meters]
put [4 oz, 2 g, 0.3 m] - [4 oz, 2 g, 0.3 m] --> [0 ounces,0 grams,0 meters]
put [4 oz, 2 g, 0.3 m] * [4 oz, 2 g, 0.3 m] --> [16 ounces^2,4 grams^2,0.09 square meters]
put [4 oz, 2 g, 0.3 m] / [4 oz, 2 g, 0.3 m] --> [1,1,1]
範囲
範囲を指定するときに単位を使用することができます。範囲の一方の端だけに単位が指定されている場合、他方の端は同じ単位タイプとみなされます:
put 3..7 m/s --> 3 meters per second to 7 meters per second
同様に、between
演算子は、2番目の値に単位が指定されている場合、単位が一致するものとして扱われます。
put 4 cm is between 1 and 3 inches --> True
Asによる変換
as
演算子を使って、値を特定の単位に変換することができます:
put 5 feet as inches --> 60 inches
put 27 grams as oz --> 0.952397 ounces
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 -- depthの値は今、fathomsになります
convert 3.5 gallons to cc -- 結果はitに格納されます
注意:Convertコマンドは、SenseTalkの日付と時間の値で説明されているように、日付と時間の形式を変換するためにも使用することができます。
Unitsプロパティ
widthのunits
プロパティは、width.units
やthe units of width
とも呼ぶすることも可能です。直接unitsプロパティを変更すると値の変換は行われないので、この方法を慎重に使用することを覚えておいてください。
set width to 6 ft
put width's units --> feet
put width --> 6 feet
convert width to yards
put width's units --> yards
put width --> 2 yards
set width's units to "feet"-- これは値の単位を直接設定し、 以前の単位を置き換えます
put width's units --> feet
put width --> 2 feet
変数のunits
プロパティに直接アクセスしたり、変更したりすることができます。ただし、この方法では値を変換しないことに注意してください:
単位を持たない素の数値に対して単位を設定したい場合もあります。例えば、ハンドラは、パラメータが明示的に他の単位で与えられていない場合、それがメートルを表すと仮定するかもしれません:
put areaOfCircle(6 in) --> 113.097336 square inches
put areaOfCircle(4) --> 50.265482 square meters
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
単位のタイプ関数
FormattedUnits
関数
**パラメータ:**単位の形式文字列と、形式化したい値を続けて記述します。あるいは、形式演算子を使用して単位の形式を数値に適用することで同じ結果を得ることができます。
valueWithUnits {with | using} format unitFormat
文法:
formattedUnits(unitFormat, valueWithUnits) valueWithUnits {with | using} format unitFormat
例:
put formattedUnits("[miles] @, [feet] @", 8765 ft) --> 1 mile, 3485 feet
put formattedUnits("[earthMass] @ + [moonMass] @", 1 sunMass) --> 332948 earthMasses + 28 moonMasses
put 35 ounces using format "[lb] lb [oz] oz" --> 2 lb 3 oz
関連する項目:
SplitUnits
関数
**振る舞い:**特定の単位タイプの数値を、元の値を合計する指定されたリストの単位に変換します。例えば、重さをポンドとオンスに、または期間を時間、分、秒に変換します。
この関数は、リクエストされた単位名を順番に巡り、元の値から順に各単位の全数を割り当てます。リストの最終単位は、値の残りの部分を受け取ります。これには、任意の分数部も含まれます。
**パラメータ:**変換、または「分割」したい値と、値を変換したい単位の名前を続けて記述します。これらは、別々なパラメータとして、または名前のリストとして渡すことができます。
最終単位に対する分数を返さないようにするために、追加の単位タイプとして“”
またはempty
を渡します。以下の例を参照してください。
文法:
splitUnits(valueWithUnits, listOfRequestedUnitNames) splitUnits(valueWithUnits, unitName1 {, unitName2, …})
例:
put splitUnits(4288.321 seconds, ["hrs","mins","secs",empty]) --> [1 hour,11 minutes,28 seconds] // 最終単位タイプよりも小さい任意の量を吸収するために 'empty' を使用する
put splitUnits(4288.321 seconds, "hrs", "mins", "secs") --> [1 hour,11 minutes,28.321 seconds]
関連する項目:
UnitNames
関数
**振る舞い:**SenseTalkが認識するすべての単位名のリスト、または特定の単位タイプのすべての単位名のリストを返します。
パラメータ:
- (デフォルト)
"all"
またはパラメータを使用しないことで、SenseTalk内のすべての単位名のリストを取得します。 - 単位タイプの名前、たとえば
"length"
を渡すと、そのタイプのす べての単位のリストを取得します。
md 構文:
unitNames({unitTypeOrAll})
例:
put unitNames("speed") --> ["knot","mph","mps","kph","knots"]
put unitNames() into allUnitNames
関連する項目:
UnitTypes
関数
**振る舞い:**SenseTalkが認識するすべての単位タイプの名前のリストを返します。同義語を含む か含まないかは問いません。
パラメータ:
- (デフォルト)
"all"
、またはパラメータを使用しないでSenseTalk内のすべての単位タイプのリストを取得します。これには同義語も含まれます。 "standard"
を渡すと、各単位タイプの標準名のリストのみを取得します。同義語は除外されます。
文法:
unitTypes({allOrStandard})
例:
put unitTypes("standard") --> ["length","mass","byteSize","duration","calendarDuration","rotation","electric_charge","area","volume","electric_current","force","pressure","stress","energy","power","electric_potential","electric_resistance","resistance","electric_conductance","conductance","electric_capacitance","magnetic_flux","inductance","magnetic_flux_density","frequency","velocity","acceleration","flow","angular_velocity","temperature_difference","currency"]
関連する項目:
UnitType
関数
**パラメータ:**単位名または単位付き数値を受け付けます。
**振る舞い:**単位名の標準単位タイプ、または数値の単位名を返します。
**振る舞い:**単位の形式を単位付き数値に適用し、形式化された値を返します。単位の形式の書き方について詳しく学ぶ。 unitType({unitNameOrValueWithUnits})
例:
put unitType("weight") --> mass
put unitType(765 ft) --> length
関連する項目:
Units Global Properties
SenseTalkには、単位の設定とフォーマットに影響を与える3つのglobal propertiesがあります。
the unitFormats
グローバルプロパティ
デフォルト:{:}
空のプロパティリスト。
**振る舞い:**単位付きの値を表示するために使用するフォーマットを決定します。unitFormats
プロパティが特定の 単位タイプのフォーマットを含んでいる場合、そのフォーマットが使用されます。ただし、値に対して別の特定のフォーマットが要求された場合はそのフォーマットが使用されます。
**値:**一つまたはそれ以上の単位タイプのデフォルト単位フォーマットを保持するプロパティリスト。
unitFormats
のキーは、unitTypes
functionによって返される有効な単位タイプでなければなりません。それぞれの単位タイプの対応する値はunit format stringでなければなりません。
単位タイプのキーは、そのタイプの標準名に自動的に標準化されます。例えば、キーweight
にフォーマットを割り当てることは完全に有効ですが、実際にはunitFormats
のmass
プロパティを設定します。例を参照してください。
例:
set the unitFormats.weight to "[lbs?] @ [oz.] @" // This actually sets the 'mass' property
put 67 ounces --> 4 lb 3 oz
put 5432 grams --> 11 lbs 15.608161 oz
例:
put 5432 sec --> 5432 seconds
set the unitFormats.duration to "[hours 00]:[minutes 00]:[seconds 00]"
put 5432 sec --> 01:30:32
例:
set the unitFormats to {
duration: "[hrs? 00*]:[mins]:[secs]",
byteSize: "[GB? 0.0*] @||MB?||KB?||Bytes",
electric_current: "Milliamp 0.###",
}
}
put 139 sec --> 02:19
put 789234 bytes --> 770.7 KB
the unitsEnabled
グローバルプロパティ
デフォルト: True
動作: 単位システムをオンまたはオフにします。the unitsEnabled
がFalse
に設定されている場合、ほとんどの単位は無視されます。互換性のため、the unitsEnabled
がオフになっているときでも、時間の単位(時間、分、秒など)とdataSize(キロバイト、メガバイトなど)の単位は尊重されます。その他の単位は無視されます。
値: True
, False
the strictUnits
グローバルプロパティ
デフォルト: True
値: True
, False
動作: 単位システムがどの程度厳格に尊重されるかを制御します。このプロパティをFalse
に設定すると、システムは単位操作に対してより寛容になります。たとえば、このプロパティをFalse
に設定し、単位付きの数にプレーンな数を加えると、SenseTalkはプレーンな数を同じ単位を持つものとして扱います(したがって、7 ft + 3 = 10 feet)エラーをスローするのではなく。他の操作では単位をドロップします(例えば、4エーカーから6ポンドまでの範囲を指定すると、"4 to 6"となり、3 ft + 4ガロン = 7となります)。