SenseTalkの主要要素
SenseTalkの簡潔な説明
経験豊富なプログラマや知識を求める方のための1時間の入門編です。
SenseTalkは、可読性の高い強力な高水準言語です。読み書きがしやすいよう、英語に似た設計を持ち、暗号的な記号や厳格な構文は極力避けられています。このセクションでは、SenseTalkを多方面から簡潔に説明していきます。
ここでご紹介する情報は、SenseTalkの主要要素の大方のあらましを素早く把握するためのものです。経験豊富なスクリプト記述者やプログラマの場合、SenseTalkの使用準備としてはこの情報で十分かもしれません。それ以外のユーザは、まずこのセクションに目を通して、これから学ぶ内容をざっと掴んでから、後に続くさらに詳しい説明に移ろうと思われるでしょう。
また、機能をとにかくすぐに再確認したいというときに、後から見直すのにもこのセクションは便利です。それぞれのトピックには、より詳しい情報を確認できるセクションの参照先を示してあります。
スクリプト
SenseTalkスクリプトは、一連のコマンド文です。スクリプトを実行すると、各文が順に実行されます。コマンドは、たいてい動詞から始まり、1つ1つが別々の行に書かれます。
put 7 into days
multiply days by 4
put days -- 28
スクリプトは、よくテキストファイルとしてお使いのコンピュータに保存されます。
SenseTalkには、大文字と小文字の区別はありません。大文字でも、小文字でも、大文字と小文字が混在した形でも書くことができ、意味は変わりません。
Put 7 into DAYS
(スクリプト構造と制御フローを参照のこと。)
単純値
SenseTalkには、次の単純値があります。
5 -- 数値
sixty-four -- 語句で表現された数値
"hello" -- テキスト文字列(全体が国際的なUnicodeテキストを可とする)
empty -- 定数
0x7F -- 16進数
<3FA64B> -- バイナリデータ
(値を参照のこと。)
技術注記 |
SenseTalkには、テキスト文字列に特殊文字を含めるための特別な「エスケープコード」はありません。どれも、見た通りに表現されます。 |
テキストブロック
複数行のテキストブロックは、{{と}}で囲むことができます。このタイプのテキストブロックは、オブジェクトのスクリプトを動的に設定したり、データブロックを定義したりする際に特に便利です。
set names to {{
Harry Potter
Hermione Granger
Ron Weasley
}}
(値を参照のこと。)
技術注記 |
テキストブロックでは、ラベルを使用することができます。これは、一部の他言語における「here is」ブロックと類似したものです。これにより、テキストブロックをネストをすることもできます。 |
演算子
演算子は、値を結合して、式にします。あらゆる種類の一般的な演算子(および、一部の一般的でない演算子)が利用可能です。宛先なしのputコマンドは、式の値を表示します。
put 3 + 2 * 7 -- 17
put five is less than two times three -- true
put "a" is in "Magnificent" -- true
put 7 is between 5 and 12 -- true
put "poems/autumn/InTheWoods" split by "/"
-- (poems,autumn,InTheWoods)
グループ演算には括弧が使えます。
put ((3 + 2) * 7) is 35 -- true
(式を参照のこと。)
連結
テキスト文字列は、&または&&を使って結合(連結)させることが可能です。&演算子は文字列をそのまま結合し、&&演算子は間にスペースを入れて結合します。
put "red" & "orange" -- "redorange"
put "Hello" && "World" -- "Hello World"
(式を参照のこと。)
値の割り当て
値はコンテナに格納することができます。変数は、単なるコンテナです。put intoまたはset toコマンドのいずれかを使うと、コンテナに値を割り当てることができます。
put 12 into counter
set counter to 12
変数は、使われたときに自動で作成されるため、はじめに宣言する必要はありません。
(コンテナを参照のこと。)
Putコマンド
また、putコマンドを使って、コンテナの中身の前または後に値を追加こともできます。
put 123 into holder -- "123"
put "X" before holder -- "X123"
put "Y" after holder -- "X123Y"
(コンテナを参照のこと。)
型なし言語
SenseTalkは型なし言語です。変数には、どんな種類の値でも入れることができます。
put 132 into bucket
-- bucketには数値が入っています
put "green cheese" into bucket
-- 今度はbucketにテキスト文字列が入っています
値は必要に応じて自動的に変換されます。
put ("1" & "2") / 3 -- 4
(式を参照のこと。)
引用符なしの文字列
格納された値がまだない変数は、その名前として評価されます。このように、引用符なしの文字列として使用でき、手間を省くことができます。
put Bread && butter -- "Bread butter"
(コンテナを参照のこと。)
定数
単語の中には、名前以外にも定義済みの値を持っているものがあります。これらは一般に「定数」と呼ばれるものですが、SenseTalkでは、ユーザが選択した変数名を最大限自由に使えるようにするため、この中でも本当の定数はごくわずかで、それ以外は変数としての使用や値の変更が可能になっています。
現実に定数なのは、true、false、up、down、end、empty、returnなどです。
put street1 & return & street2 & return & city into address
if line 2 of address is empty then delete line 2 of address
事前定義済みの変数には、数値や、quote(引用符)およびtab(タブ)などの特殊文字が含まれます。
put 2*pi
-- 6.283185
add one to count
put "Edward" && quote & "Red" & quote && "Jones"
-- Edward "Red" Jones
put comma after word 2 of sentence
(値を参照のこと。)
コメント
コメントを使って、説明的な情報を追加することができます。コメントは、スクリプトの実行時には無視され、SenseTalkによって処理されません。後からコメント行を識別できるように、コメント記号--(ダッシュ2個連続)、—(emダッシュ)または // (スラッシュ2個)を付けます。
// このスクリプトは2つの数字を足して合計値を返します
params a,b — この行で2つのパラメータの名前を宣言します
return a+b // 合計値を返します(それだけです!)
もっと長い(短い)コメントは、(*と*)で囲むこともできます。この用法は、スクリプトの一部を一時的にオフにする(「コメントアウト」する)ときにも使用されることがあります。こうした「ブロックコメント」はネストが可能です。
(*
put "the total so far is : " & total -- 値をチェックします
put "the average is : " & total / count (*ネストされたコメント*)
*)
(スクリプト構造と制御フローを参照のこと。)
チャンク式
チャンク式は、値の特定の部分を指定するときに使えます。
put word 2 of "green cheese"
-- "cheese"
put item 3 of "one,two,three,four"
-- "three"
put lines 1 to 3 of bigText
-- 最初の3行
put the first 3 lines of bigText
-- これも最初の3行
put any character of "abcdefg"
-- 1字をランダムに選択
負の番号の場合、値の後ろからカウントします。
put item -3 of "one,two,three,four" -- "two"
put chars 2 to -2 of "abcdefg" -- "bcdef"
コンテナのチャンクもまた、コンテナです(値を格納できます)。
put "green cheese" into bucket -- "green cheese"
put "blue" into word 1 of bucket -- "blue cheese"
put "ack" into chars 3 to 4 of word 1 of bucket
-- "black cheese"
(チャンク式を参照のこと。)
技術注記 |
SenseTalkのチャンク式は、他の言語のsubstring関数やスライスに似た機能ですが、ずっと表現力に富んでいて強力です。 |
リスト
値をコンマで区切って括弧内に列記するだけで、値のリストを作成することができます。
(1,2,3)
("John",67, "555-1234", cityName)
("bread", "milk", "tofu")
リストには、どんな種類の値でも入れることができ、別のリストを含めることもできます。
("Mary", 19, ("555-6545", "555-0684"), "Boston")
リストはコンテナに格納することができます。
put (2,3,5,7,11,13) into earlyPrimes
(値を参照のこと。)
リストアイテム
リスト内のアイテムには、番号でアクセスすることができます。最初の項目が1番になります。
put item 1 of ("red", "green", "blue") -- "red"
put the third item of ("c","d","e","f","g") -- "e"
コンテナ内のリストアイテムもまた、コンテナです(値を格納できます)。
put (12,17,32) into numbers -- (12,17,32)
put 99 into item 5 of numbers -- (12,17,32,,99)
add 4 to item 2 of numbers -- (12,21,32,,99)
(チャンク式を参照のこと。)
リストの結合
リストは&&&を使って結合することができます。
put ("red", "green", "blue") into colors
-- ("red", "green", "blue")
put (12,17,32) into numbers -- (12,17,32)
put colors &&& numbers into combinedList
-- ("red","green","blue",12,17,32)
1つのリストに結合するのではなく、ネストされたリスト同士のリストを作る方法も、括弧を使用して新しいリストを作成するだけです。
put (colors,numbers) into nestedList
-- (("red","green","blue"), (12,17,32))
(式を参照のこと。)
プロパティリスト
シンプルなオブジェクトまたはプロパティリストは、名前付きの値(「プロパティ」)を集めたものです。オブジェクト内のそれぞれの値は、プロパティ名で識別されます。
(size:12, color:blue)
(name:"John", age:67, phone:"555-1234", city:"Denver")
オブジェクトはコンテナに格納することができます。
put (size:8, color:pink) into description
技術注記 |
SenseTalkのプロパティリストは、他の言語でハッシュテーブル、連想配列、ディクショナリまたはレコードとして知られる集合に似ています。しかし、 SenseTalkのプロパティリストはオブジェクトであり、ある一定の特別なプロパティが設定されたときには振る舞いやデータ値を持つことができます。 |
オブジェクトプロパティ
オブジェクト内のプロパティには、名前でアクセスすることができます。
put property width of (shape:"oval", height:12, width:16) -- 16
新しいプロパティは、値を格納するだけで作成することができます。
put "red" into property color of currentShape
(コンテナを参照のこと。)
オブジェクトのプロパティにアクセスする方法は他にもいくつかあります。
put (name:"Michael") into mike -- オブジェクトを作成します
put a new object into property cat of mike
-- ネストされたオブジェクトを作成します
put "Fido" into the name of mike's cat
put mike's cat's name -- Fido
put mike.name -- Michael
さらには、「me」や「my」を使って、オブジェクトが自分自身のプロパティ(またはヘルプしているオブジェクトのプロパティ)にアクセスすることも可能です。
put the age of me
if my name begins with "s" then ...
(オブジェクトとメッセージを参照のこと。)
プロパティはコンテナなので、その中身は変更することができます。
add one to my dog's age-- 今日は飼い犬の誕生日です!
ネスティング
リストとオブジェクトは、複雑な形でネストすることができます。
(size:12, colors:(blue,orange), vendor:(name:"Jackson Industries",phone:"555-4532"))
範囲
rangeは、「to」または「..」を使って値の範囲を指定する式です。範囲は変数に格納することができます。
put 13 to 19 into teenRange
put teenRange -- 13 to 19
範囲は、明示的にリストに変換することができます。
put teenRange as list -- (13,14,15,16,17,18,19)
または、単に範囲をリストのように扱うこともできます。
put item 4 of teenRange -- 16
delete item 1 of teenRange -- teenRangeはリストになります
(範囲を参照のこと。)
イテレータ
範囲、リストまたはカスタムイテレータオブジェクトをイテレータとして使うと、一度に1つずつ連続した値を得ることができます。
put "Z" to "A" into reverseAlphabet
put reverseAlphabet.nextValue -- Z
put reverseAlphabet.nextValue -- Y
put reverseAlphabet.nextValue -- X
(イテレータを参照のこと。)
Each式
each式を使って、関心のある値のリストを作成することができます。
set saying to "Beauty lies beyond the bounds of reason"
put each word of saying where each begins with "b"
-- (Beauty,beyond,bounds)
each式では、各値に演算を適用できます。
put the length of each word of saying
-- (6,4,6,3,6,2,6)
put uppercase of each word of saying where the length of each is 6
-- (BEAUTY,BEYOND,BOUNDS,REASON)
(Each式を参照のこと。)
Repeatブロック
Repeatブロックは、一連のコマンド文を複数回繰り返すときに使います。
repeat 3 times
play "Glass"
wait one second
end repeat
repeatループには、 repeat while、repeat until、repeat with、repeat with eachなど、いくつかの種類があります。
repeat with each item of (1,3,5,7,9)
put it & tab & it squared & tab & the square root of it
end repeat
(スクリプト構造と制御フローを参照のこと。)
技術注記 |
SenseTalkでは、すべてのループにrepeatを使用します。repeatにはさまざまな形があり、他の言語で利用できる一般的なループ構文のほとんどに対応しています。 |
条件文
if / then / else構文は、条件を基に、実行するコマンドをスクリプトに選択させます。
if hoursWorked > 40 then calculateOvertime
if lastName comes before "Jones" then
put firstName && lastName & return after firstPageList
else
put firstName && lastName & return after secondPageList
end if
(スクリプト構造と制御フローを参照のこと。)
別のスクリプトの呼び出し
スクリプトでは、別のスクリプトの名前をコマンドとして使用するだけで、その別のスクリプトを実行することができます。
simplify -- simplifyスクリプトを実行します
(スクリプト構造と制御フローを参照のこと。)
パラメータ
パラメータをコマンド名の後ろに列記すると、別のスクリプトに渡すことができます。
simplify 1,2,3
(スクリプト構造と制御フローを参照のこと。)
Runコマンド
名前にスペースや特殊文字が含まれているスクリプトや、別のディレクトリに格納されているスクリプトは、runコマンドを使って実行できます。
run "more complex" -- 「more complex」スクリプトを実行します
パラメータもrunで渡すことができます。
run "lib/registerStudent" "Chris Jones","44-2516"
(メッセージの操作を参照のこと。)
ハンドラ
スクリプトには、追加的な振る舞いを定義するハンドラを含めることができます。
to handle earnWages hours, rate
add hours*rate to my grossWages
end earnWages
スクリプトでは、そのハンドラのいずれかをコマンドとして呼び出すことができます。
earnWages 40, 12.75
別のスクリプト内のハンドラは、runコマンドを使って呼び出すことができます。
run ScoreKeeper's resetScores "east", "south"
(スクリプト構造と制御フローを参照のこと。)
Try/Catchブロック
スクリプトでは、実行中のエラー発生時に投げられた例外をキャッチすることができます。
try -- エラーの捕捉を開始します
riskyOperation -- エラーを起こしそうな処理を実行します
catch theException
-- エラーからの回復用のコードをここに入れます
end try
(スクリプト構造と制御フローを参照のこと。)
例外
スクリプトでは、例外を投げることもできます。スクリプトで投げられた例外がtryブロックによってキャッチされない場合、スクリプトの実行が停止します。
throw "error name", "error description"
(スクリプト構造と制御フローを参照のこと。)
ローカルプロパティとグローバルプロパティ
ローカルプロパティやグローバルプロパティによって、スクリプト演算のさまざまな側面を操作します。コンテナとして扱うことができ、アクセスするときにはプロパティ名の前に「the」を付けます。
set the numberFormat to "0.00"
insert "Natural" after the timeInputFormat
(コンテナを参照のこと。)
ファイルアクセス
ファイルの中身には、直接アクセスすることができます。
put file "/Users/mbg/travel.log" into travelData
また、ファイルはコンテナとしても扱うことができ、そこへデータを書き込んだり、そこでデータを変更したりすることが可能です。そのファイルがまだ存在しない場合には、ファイルが作成されます。
put updatedTravelData into file "/Users/mbg/travel.log"
add 1 to item 2 of line updateIndex of file "/Users/mbg/updates"
(ファイルやフォルダとのやり取りを参照のこと。)
並べ替え
sortコマンドは、幅広い表現方法で、リスト内のアイテムやコンテナ内のテキストチャンクを柔軟に並べ替えます。
sort callsReceivedList
sort the lines of file "donors" descending
sort the items of inventory in numeric order by the quantity of each
(テキストおよびデータ操作を参照のこと。)
まとめ
上記にリストアップした機能やその簡単な説明は、SenseTalkの入門的な概要にすぎません。ここに挙がっている以外にも、SenseTalkでできることはたくさんあります。また、上記の機能にも追加的なオプションがあります。このドキュメントの以降のセクションでは、SenseTalkのあらゆる機能について詳しく説明していきます。