言語の主要要素
SenseTalkを一言で説明する
SenseTalkは強力で読みやすい高水準言語です。それは英語に似ており、可能な限り暗号化されたシンボルや厳格な構文を避けるように設計されています。これにより、読みやすさと書きやすさが両立されています。このセクションでは、言語の多くの特徴を簡単に説明します。
ここで提示する情報は、SenseTalkのほとんどの主要な要素についての簡潔な概観を提供することを目指しています。経験豊富なスクリプト作成者やプログラマーにとっては、これがSenseTalkの使用を始めるための十分な情報となるものです。他のユーザーも、このセクションをざっと見て、進む先に何が控えているかを感じ取れることでしょう。
また、物事がどのように機能するかを速やかに再確認したい時に、このセクションは便利な参照情報となります。各トピックについては、より完全な情報への参照案内があります。
スクリプト
SenseTalk _script_は一連のコマンドステートメントです。これは通常、あなたのコンピュータ上のテキストファイルとして保存されます。スクリプトが_run_されると、各ステートメントが順番に実行されます。コマンドは通常、動詞で始まり、処理が順番に行で分かれて書かれます。
スクリプトを書き始めると、SenseTalkの特徴の一つとして色分けに気づきます。スクリプトは色分けされ、スクリプトのさまざまな部分が何であるかを示しています。たとえば、変数は文字列リテラルとは異なる色になります。太字と斜体もスクリプトの異なる要素を区別するために使用されます。複数のスクリプトテーマがあり、スタイリングもEggplant Functional Script Preferences Theme Paneで完全にカスタマイズできます。
SenseTalkは大文字と小文字を区別しません。命令は大文字、小文字、または混在して書かれても意味は変わりません。
例:
Put 7 Into days
multiply Days by 4
PUT DAYS -- Prints "28"
(詳細はScript Structure and Control Flowを参照してください)
単純な値
SenseTalkにはシンプルな値があります。
例:
5 -- 数値
sixty-four -- 言葉で表現された数値
"❤ hello ❤" -- テキスト文字列 (国際ユニコードテキストが使用可能)
@"Hello\nNew\nWorld" -- エスケープコード付きテキスト文字列
empty -- 定数
0x7F -- 16進数
<3FA64B> -- バイナリデータ
(詳細はValuesを参照してください)
テキストブロック
複数行のテキストブロックは {{
と }}
で囲むことができます。この種類のテキストブロックは、オブジェクトのスクリプトを動的に設定したり、データブロックを定義したりするのに特に便利です。
例:
set names to {{
Harry Potter
Hermione Granger
Ron Weasley
}}
(詳細はValuesを参照してください)
テックトーク
テキストブロックは、他の言語の"here is"ブロックに似たラベルを使用できます。これにより、ネストも可能です。
演算子
演算子は値を式に結合します。一般的な(そしていくつかの非一般的な)演算子が使用可能です。 put
コマンドは、宛先を指定せずに式の値を表示します。
例:
put 3 + 2 * 7 -- Prints: 17
put five is less than two times three -- Prints: true
put "a" is in "Magnificent" -- Prints: true
put 7 is between 5 and 12 -- Prints: true
put "poems/autumn/InTheWoods" split by "/" -- Prints: [poems,autumn,InTheWoods]
例:
括弧は、操作をグループ化するために使用できます。
put ((3 + 2) * 7) is 35 -- true
(詳細はExpressionsを参照してください)
結合
テキスト文字列は &
または &&
を使って結合(連結)できます。 &
演算子は文字列を直接結合し、&&
は間にスペースを挟んで結合します。
例:
put "red" & "orange" -- "redorange"
put "Hello" && "World" -- "Hello World"
(詳細はExpressionsを参照)
値の割り当て
値はコンテナに保存することができます。変数はシンプルなコンテナです。 put into
または set to
コマンドのいずれかを使用して、コンテナに値を割り当てることができます。
例:
put 12 into counter
set counter to 12
変数は使用されると自動的に作成されます。最初に宣言する必要はありません。
(詳細はContainersを参照してください)
Put Command
put
コマンドは、コンテナの内容の前後に値を追加することもできます。
例:
put 123 into holder -- "123"
put "X" before holder -- "X123"
put "Y" after holder -- "X123Y"
(詳細はContainersを参照)
型のない言語
SenseTalkは型のない言語です。変数はどんな型の値でも保持できます。
例:
put 132 into bucket -- bucket is holding a number
put "green cheese" into bucket -- now bucket holds a text string
必要に応じて値が自動的に変換されます。
例:
put ("1" & "2") / 3 -- 4
(詳細はExpressionsを参照)
引用符なしの文字列
まだ値が格納されていない任意の変数は、そのまま文字列として扱われます。この方法で、それらは引用符なしの文字列として使用でき、便利です。
例:
put Bread && butter -- "Bread butter"
(詳細はContainersを参照)
定数
一部の単語は、その名前に対応する事前定義された固定値を持って います。これらは一般的に"定数"と呼ばれますが、SenseTalkはあなたが選んだ任意の変数名を、最大限に活用できるようにデザインされています。そのため、実際に事前定義されている定数はほんの少しであり、ほとんどの単語は変数として使用してその値を変更することができます。
実際の定数には true
、false
、end
、empty
、return
が含まれます。
例:
put street1 & return & street2 & return & city into address
if line 2 of address is empty then delete line 2 of address
事前定義された変数 には、数値や特殊文字(引用符やタブなど)が含まれます。
例:
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
(詳細はValuesを参照)
コメント
Comments で説明情報を追加することができます。コメントは、スクリプトが実行中のSenseTalkによって無視されます。記号--
(二つのダッシュ)、—
(エムダッシュ)、または//
(二つのスラッシュ)はその行の残り部分をコメントとしてマークします。
長い(または短い)コメントの場合、コメントを(*
と*)
で囲むことができます。このテクニックは、一時的にスクリプトの一部をオフにする(または"コメントアウト"する)ために時々使用されます。これらの"ブロックコメント"はネストすることができます。
例:
このスクリプトは二つの数値を加算し、その合計を返します。インラインコメントは二つのダッシュ記法(--
)で表記されています。
params a,b -- この行では二つのパラメータの名前を宣言します
return a+b -- 合計を返します(それだけです!)
例:
この大きなコードブロックは、括弧とアスタリスクの記法 (*
と *)
を使用してコメントアウトされています。これらはネストされています。
(*
put "the total so far is : " & total -- 値を確認
put "the average is : " & total / count (* ネストされたコメント *)
*)
(詳細はScript Structure and Control Flowを参照してください)
チャンク表現
チャンク式 は、値の一部を指定するために使用できます。
例:
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 -- bucketには"green cheese"が含まれています
put "blue" into word 1 of bucket -- bucketには"blue cheese"が含まれています
put "ack" into chars 3 to 4 of word 1 of bucket -- bucketには"black cheese"が含まれています
(詳細はChunk Expressionsを参照してください)
デックトーク
SenseTalkのチャンク式は、他の言語の部分文字列関数やスライスに類似した機能を提供しますが、それよりも表現力があり、強力です。
リスト
リスト は、カンマで区切られた値を角括弧 [
]
で列挙するだけで作成できます。
リストは通常、角括弧[]で囲まれますが、歴史的な理由から括弧で囲むこともできます。
例:
put [1,2,3]
put ["John",67, "555-1234", cityName]
put ["bread", "milk", "tofu"]
リストにはどんなタイプの値でも含めることができます、他のリストを含むこともできます。
例:
put ["Mary", 19, ["555-6545", "555-0684"], "Boston"]
リストはコンテナに保存することができます。
例:
put [2,3,5,7,11,13] into earlyPrimes
(詳細はValuesを参照してください)
リストアイテム
リストの_アイテム_は番号でアクセスできます。最初のアイテムは番号1です。
例:
put item 1 of ["red", "green", "blue"] -- Prints: "red"
put the third item of ["c","d","e","f","g"] -- Prints: "e"
コンテナのリストアイテムもまたコンテナです(それらは保存できます)。
例:
put [12,17,32] into numbers -- numbersは: [12,17,32]
put 99 into item 5 of numbers -- numbersは今: [12,17,32,,99]
add 4 to item 2 of numbers -- numbersは今: [12,21,32,,99]
(詳細はChunk Expressionsを参照してください)
リストの結合
リストは &&&
を使用して結合することができます。
例:
put ["red", "green", "blue"] into colors
-- The colors変数には: ["red", "green", "blue"]が含まれています
put [12,17,32] into numbers
-- The numbers変数には: [12,17,32]が含まれています
put colors &&& numbers into combinedList
-- The combinedList変数には: ["red","green","blue",12,17,32]が含まれています
単一のリストに結合する代わりにネストしたリストのリストを作成するには、新しいリストを 作成するために括弧を使用します。
例:
put ["red", "green", "blue"] into colors
-- colorsには: ["red", "green", "blue"]が含まれています
put [12,17,32] into numbers
-- numbersには: [12,17,32]が含まれています
put colors &&& numbers into combinedList
-- combinedListには: ["red","green","blue",12,17,32]が含まれています
put [colors,numbers] into nestedList
-- nestedListには色と数のリストの両方が含まれています:
-- [["red","green","blue"], [12,17,32]]
(詳細はExpressionsを参照)
プロパティリスト
単純なオブジェクト または プロパティリスト は、名前付きの値(プロパティ と呼ばれます)の集合です。オブジェクトの各値は、そのプロパティ名で識別されます。
プロパティリストは通常、波括弧で囲まれますが、歴史的な理由から括弧で囲むこともできます。
例:
put {size:12, color:blue} into myJeans -- このリストのプロパティ名は "size" と "color" です。
put {name:"John", age:67, phone:"555-1234", city:"Denver"} into GreatSinger -- このリストのプロパティ名は "name", "age", "phone", そして "city" です。
オブジェクトはコンテナに保存できます。
例:
put {size:8, color:pink} into description
(詳細はValues、Lists,、Property Listsを参照してください)
Tech Talk
SenseTalkのプロパティリストは、他の言語で知られているハッシュテーブル、連想配列、辞書、またはレコードというコレクションに似ています。しかし、SenseTalkのプロパティリストは、特定の特殊なプロパティが設定されている場合にはデータ値だけでなく振る舞いも持つことができるオブジェクトです。
オブジェクトのプロパティ
オブジェクトのプロパティは名前でアクセスすることができます。
例:
put property width of {shape:"oval", height:12, width:16} -- 印刷: 16
新しいプロパティはそれに保存することで簡単に作成するこ とができます。
例:
put "red" into property color of currentShape
(詳細はContainersを参照)
オブジェクトのプロパティはいくつかの異なる方法でアクセスすることができます。
例:
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
もし私の名前が"s"で始まるなら ...
(オブジェクトとメッセージを参照)
プロパティはコンテナーであり、その内容は変更可能です。
例:
add one to my dog's age -- 今日は彼女の誕生日だ!
ネスト
リストやオブジェクトは複雑にネストできます。
例:
put {size:12, colors:[blue,orange], vendor:{name:"Jackson Industries",phone:"555-4532"}}
範囲
範囲はto
または..
を使用して値の範囲を指定する式です。範囲は変数に保存できます。
例:
put 13 to 19 into teenRange
put teenRange -- 表示: "13 to 19"
範囲は明示的にリストに変換できます。
例:
put 13 to 19 into teenRange
put teenRange -- 表示:13 to 19
put teenRange as list -- 表示:[13,14,15,16,17,18,19]
あるいは、範囲はリストのように扱うこともできます。
put 13 to 19 into teenRange
put teenRange -- 表示:13 to 19
put item 4 of teenRange -- 表示:16
delete item 1 of teenRange -- teenRangeは今やリスト:[14,15,16,17,18,19]
(範囲を参照)
#iterators
範囲、リスト、またはカスタムのイテレータオブジェクトを_イテレータ_として使用して、一度に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 3 times
play "Glass"
wait one second
end repeat
repeat while, repeat until, repeat with、およびrepeat with eachを含む複数のタイプのrepeatループが利用可能です。
例:
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
-- hoursWorkedには数値が含まれ、calculateOvertimeはハンドラで
-- hoursWorkedが40を超える場合、残業時間を計算する機能。
if lastName comes before "Jones" then
-- この条件文は、 残業時間に基づいて従業員を2つのリストに分類します。
put firstName && lastName & return after firstPageList
else
put firstName && lastName & return after secondPageList
end if
(スクリプトの構造と制御フローを参照)
別のスクリプトの呼び出し
_パラメータ_は、コマンド名の後にリストとして記述することにより、他のスクリプトに渡すことができます。
例:
simplify 1,2,3
-- "simplify"というスクリプトを実行し、そのスクリプトに3つの値をパラメータとして渡す
(スクリプトの構造と制御フローを参照)
パラメータ
スクリプトは、別のスクリプトの名前をコマンドとして使用するだけで、そのスクリプトを_実行_することができます。
例:
simplify -- "simplify"というスクリプトを実行
(スクリプトの構造と制御フローを参照)
Run コマンド
スクリプトの名前にスペースや特殊文字が含まれている場合、または別のディレクトリにある場合、run
コマンドを使用してそれを実行することができます。
例:
run "more complex" -- "more complex"スクリプトを実行
パラメータもrunを使用して渡すことができます。
例:
run "lib/registerStudent" "Chris Jones","44-2516"
-- "lib/registerStudent"というスクリプトを実行し、2つのパラメータを渡す:
-- "Chris Jones" と "44-2416"。
(メッセージを参照)
ハンドラ
スクリプトには、追加の動作を定義する_ハンドラ_が含まれることがあります。
例:
to handle earnWages hours, rate
add hours*rate to my grossWages
end earnWages
スクリプトは、ハンドラをコマンドとして呼び出すことができます。
例:
earnWages 40, 12.75 -- earnWagesというハンドラを呼び出す
to handle earnWages hours, rate
add hours*rate to my grossWages
end earnWages
別のスクリプトのハンドラは、runコマンドを使用して呼び出すことができます:
run ScoreKeeper's resetScores "east", "south"
(スクリプトの構造と制御フローを参照)
Try/Catch ブロック
スクリプトは、実行中に発生したエラーでスローされる任意の例外をキャッチすることができます:
try -- エラーのトラップを開始
riskyOperation -- エラーを発生させる可能性のある操作を行う
catch theException
-- ここにエラーから回復するためのコードを記述
end try
(スクリプトの構造と制御フローを参照)
例外
スクリプトはまた、例外をthrow
することができます。スクリプトによってスローされた例外が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の全ての特徴を詳細に説明しています。