関数
関数
は、値の源となるハンドラの一種です。SenseTalkは、さまざまな目的に使用できる多くの関数を提供しています。現在時刻
のように、使用するたびに異なる値を生成する関数もあります。他の関数は、何のパラメータ
が渡されたかによって異なる値を生成します。同じ関数でもパラメータの値が異なると結果も異なります。パラメータの渡し方については、Parameters and Resultsを参照してください。
SenseTalk言語の一部として組み込まれている関数については、本マニュアルの各所、特 にCommands and Functionsセクションで説明しています。SenseTalkが実行されているホストアプリケーション環境は、他の事前定義された関数を提供する場合があります。また、自分で関数を書いてスクリプトで使用することもできます。詳細についてはHandlersを参照してください。
関数の呼び出し
関数の値を使用するためには、スクリプトがその関数を「呼び出す」必要があります。これは単独で行うことも、式の一部として行うことも可能です。SenseTalkは、関数を呼び出すためのいくつかの方法を提供しており、具体的な状況に応じて最も自然な方法を選ぶことができます。最もシンプルなタイプの関数呼び出しは、パラメータがなく特定のオブジェクトに送られていないものです。このような関数呼び出しは、関数名の後に空の括弧ペア(パラメータがないことを示す)を続けるか、「the」の後に関数名を続けることで行うことができます。
put date() -- 日付を表示
put the date -- 日付を表示
単一のパラメータを持つ関数を呼び出すには、そのパラメータを関数名の後の括弧内に含めるか、関数名の後に「of」とパラメータを続けます。
put length("abcd") -- 4
put the length of "abcd" -- 4
上記の二番目のケースでは、「of」を使用しているため、SenseTalkは「the」がなくても関数呼び出しとして認識することができます。
put length of "abcd" -- 4
多くの関数(「length」関数など)が値の属性を計算するため、SenseTalkではプロパティアクセス表記を用いて関数を呼び出すことも可能です。
put "abcd"'s length -- 4
put "abcd".length -- 4
一つ以上のパラメータを持つ関数を呼び出すことは、一つのパラメータを持つケースと同様です。以下のすべてが平均関数に4つのパラメータを渡します。
put average(2,4,6,8) -- 5
put the average of 2 with (4,6,8) -- 5
put 2's average(4,6,8) -- 5
put 2 .average(4,6,8) -- 5
これらの一部はこのケースでは少し奇妙に見えるかもしれませんが、他の状況ではそれらの形がより自然に見えるかもしれません。(上記の最後の例では、数字2の後にスペースが必要です。これは、ピリオドが小数点と解釈されるのを防ぐためです。)
呼び出す関数の名前は、関数名の代わりに括弧内の式を使用することで動的に生成することができます。
set funcToCall to "length" -- 関数の名前
put (funcToCall) of "abcd" -- 4
関数のリストは、一度に同じ値に対して呼び出すことができ、対応する結果のリストを生成します:
put [length, uppercase, lowercase] of "Test" -- [4,"TEST","test"]
例
以下は、一つのパラメータ(aWord
)を取り、その値の変更されたコピーを返す関数ハンドラの例です:
function plural aWord
if aWord ends with "s" then put "es" after aWord
else if aWord ends with "y" then put "ies" into the last char of aWord
else put "s" after aWord
return aWord
end plural
以下は、この関数がスクリプトから呼び出される方法の例です:
ask "What type of object are you carrying?"
put it into itemType
ask "How many do you have?"
put it into howMany
if howMany is not 1 then put the plural of itemType into itemType
answer "You have " & howMany && itemType