式
式の構成要素として使用できる値の種類も多種多様です。数値やテキスト文字列(値を参照)などの単純値でも、コンテナの中にある値(コンテナを参照)でも構いません。値の種類としては他にも、「関数」によって与えられる値があります。関数は、可変の情報を取得して、値を生み出します。SenseTalkには、幅広い目的に対応した数々の関数があります。このセクションでは、SenseTalk式内における関数の使い方について説明します。
SenseTalkは「型なし」言語のため、数値やテキスト、日付、リストなど、どんな種類の値でもコンテナに格納することが可能です。値は必要に応じて自動変換されます。例えば、テキスト値で数学的な演算を実行すると、 SenseTalkが内部でその値を数値に変換してくれます。内部値をテキストフォーマットに戻すにあたって、使用されるフォーマットをユーザが操作できる仕組みもSenseTalkは備えています。
演算子の優先順位
複雑な式では、演算子の優先順位に応じ、特定の順番で演算子の評価が行われていきます。演算子の優先順位は次のとおりです。一番上が最も高い優先順位(最初に評価されるもの)、一番下が最も低い優先順位(最後に評価されるもの)になります。
1位 |
( ) (括弧で囲まれた式の評価が最初に行われます) |
2位 |
(暗黙の連結――下記を参照) |
3位 |
not - (単項マイナスまたは否定) |
4位 |
^ squared cubed % ago hence as |
5位 |
* / div rem modulo joined by split by rounded to rounded to nearest |
6位 |
+ - adding replacing removing retaining |
7位 |
& && is a multiple of is divisible by |
8位 |
&&& |
9位 |
> < >= <= between contains is in is among is a is within |
10位 |
= <> begins with ends with |
11位 |
and and if |
12位 |
or or if |
1つの式に同じ優先順位の演算子が使われている場合は、左から右に評価が行われます。どのような場合であれ、括弧を部分式の周囲に用いると、式の他の部分よりも先に評価させることが可能です(以降の「括弧の使用」を参照)。
暗黙の連結
文字列リテラル、定数、特定の事前定義済みの変数が、間に演算子を挟まずに式内で連続しているときは、暗黙の連結が起こります。例えば、次の式は
次の式と同じ結果になります。
定数(return、true、false、empty、up、down)以外に、暗黙の連結が可能な事前定義済みの変数としては、space、tab、quote、comma、slash、backslash、newline、linefeed、lf、carriagereturn、creturn、cr、crlfがあります。
括弧の使用
SenseTalk式で括弧を使用する目的はいくつかあります。
グループ演算
括弧は、演算を特定の順番で行わせたり、存在しかねない曖昧さを解消したりする目的で使用することができます。例えば、次の曖昧な式を考えてみましょう。
もし友人に「16足す9の平方根は?」と聞かれたら、 すぐさま16と9を足して25を導き出し、その平方根をとって「5」と答えるでしょう(いつもこうしますよね?)。または、友人が語勢を少し変え、「16」の後に短い間をおいて「16、足す9の平方根は?」のように質問してくるかもしれません。この場合は、まず9の平方根を計算してから、それに16を足して「19」と答えを出すでしょう。
スクリプトには、この式にどちらの解釈を採用すべきか読み手に教えてくれる音声的な手掛かりはありません。その意味合いは曖昧に感じられ、どちらとも解釈できます。実際には、SenseTalkの優先順位ルールが作用するため、後者の方法で評価が行われ、19という結果が導き出されます。もし、これが意図する結果でなかったら、先に評価させたい式の部分を括弧で囲む必要があります。
スクリプトにおいては、スクリプトの行っていることを読み手(後日の自分自身も含め)が正確に理解できるよう、読みやすさが重要になります。そのため、元々備わっているルールによって目的の答えが得られる場合でも、意図を明確にするために括弧を含めるのが賢明かもしれません。
強制的に式として評価させる
特定のコンテキストでは、単語はリテラル値として扱われます(引用符で囲まれている場合と同じように)。そうではなく式として(特に1単語の場合は変数名として)評価させるときは、こうした単語を括弧で囲みます。この方法が一番よく使われるのはプロパティ名のケースです。
account.balance
これは、account(口座)オブジェクトの「balance(残高)」プロパティにアクセスする式です。ここで、スクリプトにおいて残高にアクセスしたいときと、availableBalance(利用可能残高)にアクセスしたいときがあるとしましょう。スクリプトでは、前段階でどちらのタイプの残高を使用するか決めてあります。
set balanceToUse to "balance" -- withdrawal(引き出し)がなければ実際の全残高を使用します
if action is "withdrawal" then set balanceToUse to "availableBalance"
次の式で残高にアクセスしようとしたとします。
account.balanceToUse
残念ながら、この式では口座の「balanceToUse(使用する残高)」という誤った名前のプロパティにアクセスしようとしてしまいます。balanceToUse変数に格納されたプロパティ名を使用するためには、変数名の周りを括弧で囲って、これを式として評価させます。
account.(balanceToUse)
必須の括弧
一部の式では、括弧を必ず使用しなければなりません。例えばリストは、コンマで区切ったアイテムを括弧内に列記することで作成することが可能です。他にも、プロパティリスト、複数パラメータによる関数の呼び出し、(if...then...else...)のセレクタ式などが例として挙げられます。
リストを使ったベクトル演算
式ではベクトル演算がサポートされています。2つの数値リストのアイテム数が同じであれば、その2つのリストを足したり引いたりすることが可能です。加算/減算は、2つのリストの対応するアイテム同士で行われます。また、ベクトル演算では、ネストされたリストも扱うことができます。ただし、対応するすべてのサブリスト同士は長さが同じでなければなりません。
put (1,2,3) + (100,200,300)-- (101,202,303)
リスト同士の乗算や除算も、リストの長さが同じ場合に機能します。
put (100,200,300) / (2,10,100)-- (50,20,3)
さらに、1つの値を使ってリストを掛けたり割ったりすることもできます(リスト内のすべての値をスケーリングするため「スカラー」と呼ばれることがあります)。
put (1,2,3) * 6 -- (6,12,18)
大文字小文字の区別
テキスト比較演算子は、通常、次の例のように大文字と小文字を区別しません。
put "FLoWeR" is "flower" -- True
演算における大文字と小文字の区別を操作する方法は2通りあります。the caseSensitiveプロパティをtrueまたはfalseに設定すると、大文字と小文字をデフォルトで異なる扱いにするかどうかが定義できます。ハンドラごとのローカルなこのプロパティは、各ハンドラの開始時点ではfalseに設定されているため、通常は大文字小文字の区別は無視されます。
the caseSensitiveプロパティに関する詳細については、値の扱いに関するグローバルプロパティとローカルプロパティをご覧ください。
大文字小文字の区別は、それぞれの比較ごとにカスタマイズすることもできます。これは、 thecaseSensitiveプロパティの設定よりも優先されます。カスタマイズ方法は、各演算子に対して、considering case、with caseもしくはcase sensitive (大文字小文字の区別を考慮させる場合)、またはignoring case、without caseもしくはcase insensitive(大文字小文字の区別を無視させる場合)を指定します。
put "FLoWeR" is "flower" considering case -- False
演算子と関数
作成しようとする式の中で具体的な演算子や関数をどのように使ったらよいかは、以下のトピックを通して理解することができます。