リスト
リストとプロパティリストは、スクリプト内のデータを整理し、操作するための便利で強力な手段を提供します。このセクションでは、リストの機能を十分に利用するために知っておくべき重要な事項を紹介します。
リストの操作に関する詳細は、Chunk Expressions、および Repeat with Eachにおける制御構造の議論を参照してください。
リストとプロパティリストに加えて、SenseTalkは階層的なツリー構造も提供しており、Using XML and Tree Structures in SenseTalk Scriptsで説明されています。
リストの作成
スクリプトでリストを作成するには、カンマで区切られた1つ以上の式を四角括弧 [ ]
で囲んでリストにします。リストは全体が一行に収まる場合、括弧 ( )
で囲むこともできます。四角括弧で囲まれたリストは、リスト内の任意の項目の後に改行を入れることで複数行に分けて書くことができます(これは括弧で囲まれたリストでは機能しません)。四角括弧を使うことが推奨されています。なぜなら、これによりリストの構文が明確で一貫性があり、また他のスクリプト要素と区別がつくからです。
構文:
[ expr { , expr}... ]
( expr { , expr}... )
{ expr { , expr}... }
[ ]
{an} empty list
Eggplant Functional 20.1以前では、リストとプロパティリストの両方がデフォルトで括弧 () を使用していました。四角括弧 [] や中括弧 (それぞれ)の代わりにです。括弧はプロパティリストの有効な構文として引き続き認識されますが、混乱を招く可能性があるため、その使用は推奨されません。
例:
put [1,3,5,7,9] into oddList
例:
put [["dog", "Fido"], ["cat", "Cleo"]] into nestedList // リストのリストを作成します
例:
set myList to ["sandwich",49,the date]
例:
set TestEnvironments = ["Windows","MacOSX","Android","iOS"]
例:
四角括弧 [] を使用してリストを複数行に分けることも可能です:
set searchPaths to [
"/Library/WebServer/Documents",
"~/Documents",
"/Users/hemingway/Documents/temp/ImportantStuff" ]
リスト、他のリストやプロパティリストを含むリストは、パラメータとして渡すことができます。パラメータとしてのリストについての詳細は、Parameters and Resultsを参照してください。
リストの内容
リストには、他のリストやプロパティリストを含む任意のタイプの値を含めることができます。
リストを構成する際に表現も使用できます:
例:
put ["geranium", pi * (2 * radius), {age:42}] into mixedList // "pi_* (2 * radius)"は表現であり、"{age:42}"はプロパティリストです
例:
put [1,[2,[3,4]],5] into nestedList // リ スト'[1,[2,[3,4]],5]'を変数に格納します。
単一項目のリスト
角括弧[]を使用して作成される単一項目のリストはSenseTalkによってリストとして認識されます。角括弧は単一項目がリストであることを示しているため、カンマは必要ありません。
例:
put [12] into shortList // これは1つの項目を持つリストを作成します
スクリプト内で単一値が括弧内に含まれている場合、括弧はグループ化演算子として扱われるため、その値はリストとして扱われません。括弧内の単一項目をSenseTalkがリストとして認識するようにするには、値の後にカンマを含めます:
例:
put (12,) into shortList // これは1つの項目を持つリストを作成します
単一のアイテムリストを単一の値として扱う方法
ほとんどの目的では、単一項目を含むリストは単一の(非リスト)値と同じように扱われます。
例:
以下の例では、myListは[4]、つまり、数値4を含む単一項目のリストです。別の数値がこの値に加えられ、非リスト値であるかのように扱われます。以下の例では、この基本的な算術に続いて、変数theSum
は数値6を含みます。
put [4] into myList -- 単一項目のリストを作成する
put myList + 2 into theSum -- これは単一の非リスト値であるかのように、単一のリスト項目'4'に2を追加します
put theSum -- '6'を出力します
通常、テキストとしてそのようなリストにアクセスすると、値は角括弧内に表示されます。この動作を避けるためには、the listFormat
のprefix
およびsuffix
プロパティを空に設定します。
空のリスト
空のリストを作成するには、空の角括弧ペアを使用するか、empty list
というフレーズを使用します:
例:
put [] into newlist // newlistは現在、項目がないリストです
put 16 into item 1 of newlist // [16]
put empty list into item 2 of newlist // [16,[]]
リストに項目を挿入する
insert
コマンドを使用して、リストまたはリストの任意の項目に項目を前、中、または後に挿入します。挿入は常に宛先コンテナをリストとして扱い、すでにリストでない場合はそれをリストに変換します。
例:
put "abc" into myVar // 変数にテキスト(実際にはリストではない)として'abc'を格納します
put "de" after myVar // 'abc'に'de'を追加して'abcde'になります(まだリストではありません)
insert "xyz" after myVar // myVar変数の内容'abcde'を最初のリスト項目として、'xyz'を2番目の項目として使用してリストを作成します。結果はリスト["abcde","xyz"]です
insert 24 before item 2 of myVar // リストに追加の項目を挿入し、結果としてのリストは["abcde",24,"xyz"]になります
例:
put "First, let's connect to our SUT." into instructions // 変数instructionsにテキスト文字列を格納します
insert "Next, let's enter Capture Mode." after instructions // リストを作成するために2番目のテキスト文字列を挿入します
put instructions // コンマの位置に基づいて4項目のリストに見えるが実際には2項目のリストである[First, let's connect to our SUT. Next let's enter Capture Mode.]を表示します
set the listFormat to {prefix:"(",suffix:")",separator:"|"} // listFormatを変更してリスト項目をカンマではなく|で区切ります
put instructions // リストには4つではなく2つの項目しかないことが明らかになる(First, let's connect to our SUT.|Next, let's enter Capture Mode.)を表示します
他のリストにアイテムのリストを挿入するときには、挿入を完了するための2つの可能な方法があります。デフォルトのモードである「アイテムごと」は、ソースリストから各アイテムを目的のリストに挿入する方法です:
例:
put [1,2,3,4] into list // [1,2,3,4]
insert [A,B] after item 2 of list // アイテム2のリスト // -- [1,2,A,B,3,4]
また、「ネスト」というキーワードを使ってリストに他のリストを挿入し、ネストされたリストを作成することも可能です:
例:
put [1,2,3,4] into list // [1,2,3,4]
put ["A","B"] into otherList // [A,B]
insert otherList nested after item 2 of list // [1,2,[A,B],3,4]
標準的な挿入の振る舞いを制御するためには、 the listInsertionMode
ローカルプロパティ または the defaultListInsertionMode
グローバルプロパティ を "nested" または "item by item" のいずれかに設定します:
例:
put [1,2,3] into aList
set the listInsertionMode to "nested"
insert [4,5] into aList -- [1,2,3,[4,5]]
詳細については、挿入
コマンドを参照してください。
Push, Pull, および Pop
push
コマンドは insert
コマンドと同義です。 pop
コマンドはリストから最後の値を削除し、変数に格納します。 push
と pop
コマンドはリストをスタックとして扱います。スタックにプッシュされたアイテムは pop
コマンドを使用して逆の順序で取得できます。
例:
put ["carrots","bananas","pistachios"] into GroceryList
pop GroceryList into gList
put gList // "pistachios"を返す
詳しくは insert
コマンドを参照してください。
例:
put ["carrots","bananas",""pistachios"] into GroceryList
pull GroceryList into gList
put gList // "carrots"を返す
リストから pop
または pull
するアイテムを指定することもできます。
例:
put ["carrots","bananas","pistachios","lettuce","wasabi"] into GroceryList
pull item 4 of GroceryList into gList
put gList // "lettuce"を返す
リストの結合
二つのリストを一つに結合する(ネストしない)には &&&
演算子を使用します。
例:
put [3,4,5] into tr1 // [3,4,5]
put [5, 12,13] into tr2 // [5,12,13]
put tr1 &&& tr2 into longList // 一つの、ネストされていないリストを作成します [3,4,5,5,12,13]
put [tr1,tr2] into twoTriples // ネストされたリストを作成します - 二つのリストのリスト [[3,4,5],[5,12,13]]
リストアイテムへのアクセス
リスト内のアイテムへのアクセス、アイテムの範囲やアイテムのリストを含む、は item
と items
chunk expressions (またはそれらのより明確な形、 list item
と list items
)を使用して完全にサポートされていま す。単一のアイテムにアクセスすると、そのインデックスのアイテムが生成されます。アイテムの範囲にアクセスすると、範囲が単一のアイテムを指定していても常にリストが生成されます:
例:
put [1,2,3,4,5] into NumberList // [1,2,3,4,5]
put list items 3 to last of NumberList // [3,4,5]
put item 2 of NumberList // 2 を表示
put items 2 to 2 of NumberList // シングルアイテムリスト '[2]' を表示
put items [4,2,5] of NumberList // [4,2,5] を表示
例:
["cheddar","provolone","brie","muenster","mozzarella"] into CheeseList
put the penultimate item of CheeseList // 'muenster' を表示
put item random(5) of CheeseList // リストからランダムなアイテムを表示
put "My favorite cheese is " & the third item of CheeseList // "My favorite cheese is brie." を表示
デフォルトでは、item
という語は、対象の変数がリストとして認識されていない場合、テキストアイテムを指す。明示的に list item
を使用すると、変数が非リスト値を含んでいても常にリストとして扱います(その場 合、その値を含む1アイテムのリストとして扱われます)。
例:
put <<"Welcome to Mars", said the alien.>> into NotList
put item 1 of NotList // 表示: "Welcome to Mars"
put list item 1 of NotList // 表示: "Welcome to Mars", said the alien
リストのテキストへの変換
split
とjoin
のコマンドと関 数、そしてasText
関数(テキストの扱いで詳しく説明されています)、および対応するsplit by
とjoined by
の演算子(Expressionsで説明されています)は、テキストをリストに明示的に変換したり、その逆をしたりする方法を提供します。
例:
join ["peanut butter","bread","jelly"] using "," // 'peanut butter,bread,jelly' の文字列を作成
リストがテキストとしてアクセスする必要がある場合(put
コマンドによって表示される場合など)、SenseTalkはそれを自動的にテキスト表現に変換します。デフォルトでは、この変換はリスト全体を括弧で囲み、リスト内のアイテムをカンマで区切ることで行われます。このフォーマット方法を変更するには、the listFormat
グローバルプロパティ の prefix
、separator
、suffix
の値を設定します。prefix
はリストの前に使用されるテキスト(通常は左括弧)、separator
はアイテム間に挿入されるテキスト、そして suffix
はリストの後に追加されるテキストです。これらの値はあなたが好きなテキストに設定でき、empty
も含みます。
例:
set the listFormat to {prefix:"<<", separator:":", suffix:">>"}
put [1,2,3,4,5] // リストをテキスト表現に変換して表示 <<1:2:3:4:5>>
例:
put {prefix:"+",suffix:"+",separator:empty} into the ListFormat
set Weather to ["windy","rainy","sunny"]
put items 2 to 3 of Weather // '+rainysunny+' を表示
リストがテキストに変換されると、リスト内の各値がテキスト表現に変換されます。これらの値の引用符を制御するには、the listFormat
グローバルプロパティの quotes
値を設定します。このプロパティについての詳細は、the listFormat
を参照してください。
テキストをリストに変換
split
、join
コマンドと関数、そして asText
関数は、テキストとの作業で詳述されており、対応する split by
と joined by
演算子(Expressionsで説明)は、明示的にテキストをリストに変換したり逆にする方法を提供します。
例:
split "Peter-Paul-Mary" by "-" // リスト'[Peter,Paul,Mary]'を作成します
データ駆 動型テストでカンマ区切りの.txtファイルやCSVファイルを使用すると、SenseTalkがアクセスするデータファイルの各行はリストではなくテキスト文字列です。この文は、データファイル内でリストのようにフォーマットされているテキスト文字列であっても真です。SenseTalkがテキスト文字列内のアイテムにアクセスしてイテレートする能力は、その内容をリストとして扱いたい場合でもファイルからの入力の特別な処理は必要ありません。しかし、これらのケースでは実際にリストを扱っていないという理解が、特定の状況で重要になることがあります。
例:
put [2 ounces,3 ounces,4 ounces] into SizesList
put SizesList * [.5,.2,.7] // Displays the list '[1 ounce,0.6 ounces,2.8 ounces]'.
put line 1 of file resourcePath("sizes.txt") into SizesFile // Line 1 of file sizes.txt contains '2 ounces,3 ounces,4 ounces', which is a text string
put SizesFile * [.5,.2,.7] // The content of the input is not a number and SenseTalk cannot take its value, so the SenseTalk code throws an error when executed