式は、各種演算子を用いて値同士を結び付け、新しい値を生成します。例えば、非常に簡単な1+2という式は、「+」演算子を使って3という値を生成します。SenseTalkには、多様なニーズに応える幅広い演算子が用意されています。

式の構成要素として使用できる値の種類も多種多様です。数値やテキスト文字列(を参照)などの単純値でも、コンテナの中にある値(コンテナを参照)でも構いません。値の種類としては他にも、「関数」によって与えられる値があります。関数は、可変の情報を取得して、値を生み出します。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つの式に同じ優先順位の演算子が使われている場合は、左から右に評価が行われます。どのような場合であれ、括弧を部分式の周囲に用いると、式の他の部分よりも先に評価させることが可能です(以降の「括弧の使用」を参照)。

暗黙の連結

文字列リテラル、定数、特定の事前定義済みの変数が、間に演算子を挟まずに式内で連続しているときは、暗黙の連結が起こります。例えば、次の式は

"Line 1" return "This is " "Line 2"

次の式と同じ結果になります。

"Line 1" & return & "This is " & "Line 2"

定数(return、true、false、empty、up、down)以外に、暗黙の連結が可能な事前定義済みの変数としては、space、tab、quote、comma、slash、backslash、newline、linefeed、lf、carriagereturn、creturn、cr、crlfがあります。

括弧の使用

SenseTalk式で括弧を使用する目的はいくつかあります。

グループ演算

括弧は、演算を特定の順番で行わせたり、存在しかねない曖昧さを解消したりする目的で使用することができます。例えば、次の曖昧な式を考えてみましょう。

the square root of nine plus sixteen

もし友人に「16足す9の平方根は?」と聞かれたら、 すぐさま16と9を足して25を導き出し、その平方根をとって「5」と答えるでしょう(いつもこうしますよね?)。または、友人が語勢を少し変え、「16」の後に短い間をおいて「16、足す9の平方根は?」のように質問してくるかもしれません。この場合は、まず9の平方根を計算してから、それに16を足して「19」と答えを出すでしょう。

スクリプトには、この式にどちらの解釈を採用すべきか読み手に教えてくれる音声的な手掛かりはありません。その意味合いは曖昧に感じられ、どちらとも解釈できます。実際には、SenseTalkの優先順位ルールが作用するため、後者の方法で評価が行われ、19という結果が導き出されます。もし、これが意図する結果でなかったら、先に評価させたい式の部分を括弧で囲む必要があります。

the square root of (nine plus sixteen)

スクリプトにおいては、スクリプトの行っていることを読み手(後日の自分自身も含め)が正確に理解できるよう、読みやすさが重要になります。そのため、元々備わっているルールによって目的の答えが得られる場合でも、意図を明確にするために括弧を含めるのが賢明かもしれません。

(the square root of nine) plus sixteen

強制的に式として評価させる

特定のコンテキストでは、単語はリテラル値として扱われます(引用符で囲まれている場合と同じように)。そうではなく式として(特に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 casewith caseもしくはcase sensitive (大文字小文字の区別を考慮させる場合)、またはignoring casewithout caseもしくはcase insensitive(大文字小文字の区別を無視させる場合)を指定します。

put "FLoWeR" is "flower" considering case -- False

演算子と関数

作成しようとする式の中で具体的な演算子や関数をどのように使ったらよいかは、以下のトピックを通して理解することができます。

数学演算子

比較演算子

論理演算子

テキスト演算子

プロパティリスト演算子

日付演算子

その他の演算子

関数

値の変換

ランタイム時における式評価

 

This topic was last updated on 2月 01, 2019, at 11:13:23 午前.

Eggplant icon Eggplant.io | Documentation Home | User Forums | Support | Copyright © 2019 Eggplant