メインコンテンツまでスキップ

リスト

リストとプロパティリストは、スクリプト内のデータを整理し、操作するための便利で強力な手段を提供します。このセクションでは、リストの機能を十分に利用するために知っておくべき重要な事項を紹介します。

リストの操作に関する詳細は、Chunk Expressions、および Repeat with Eachにおける制御構造の議論を参照してください。

リストとプロパティリストに加えて、SenseTalkは階層的なツリー構造も提供しており、Using XML and Tree Structures in SenseTalk Scriptsで説明されています。

リストの作成

スクリプトでリストを作成するには、カンマで区切られた1つ以上の式を四角括弧 [ ] で囲んでリストにします。リストは全体が一行に収まる場合、括弧 ( ) で囲むこともできます。四角括弧で囲まれたリストは、リスト内の任意の項目の後に改行を入れることで複数行に分けて書くことができます(これは括弧で囲まれたリストでは機能しません)。四角括弧を使うことが推奨されています。なぜなら、これによりリストの構文が明確で一貫性があり、また他のスクリプト要素と区別がつくからです。

構文:
[ expr { , expr}... ]
( expr { , expr}... )
{ expr { , expr}... }
[ ]
{an} 空のリスト

ノート

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 listFormatprefixおよび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 コマンドはリストから最後の値を削除し、変数に格納します。 pushpop コマンドはリストをスタックとして扱います。スタックにプッシュされたアイテムは 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]]

リストアイテムへのアクセス

リスト内のアイテムへのアクセス、アイテムの範囲やアイテムのリストを含む、は itemitems chunk expressions (またはそれらのより明確な形、 list itemlist 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 // Displays を表示
put items 2 to 2 of NumberList // シングルアイテムリスト '[2]' を表示
put items [4,2,5] of NumberList // [4,2,5] を表示

例:

["cheddar","provolone","brie","muenster","mozzarella"] を CheeseList に put
CheeseList の最後から二番目の item を put // 'muenster' を表示
CheeseList の item random(5) を put // リストからランダムなアイテムを表示
"My favorite cheese is " & CheeseList の third item & period を put // "My favorite cheese is brie." を表示

デフォルトでは、item という語は、対象の変数がリストとして認識されていない場合、テキストアイテムを指す。明示的に list item を使用すると、変数が非リスト値を含んでいても常にリストとして扱います(その場合、その値を含む1アイテムのリストとして扱われます)。

例:

<<"Welcome to Mars", said the alien.>> を NotList に put
NotList の item 1 を put // 表示: "Welcome to Mars"
NotList の list item 1 を put // 表示: "Welcome to Mars", said the alien

リストのテキストへの変換

splitjoinのコマンドと関数、そしてasText関数(テキストの扱いで詳しく説明されています)、および対応するsplit byjoined byの演算子(Expressionsで説明されています)は、テキストをリストに明示的に変換したり、その逆をしたりする方法を提供します。

例:

join ["peanut butter","bread","jelly"] using "," // 'peanut butter,bread,jelly' の文字列を作成

リストがテキストとしてアクセスする必要がある場合(putコマンドによって表示される場合など)、SenseTalkはそれを自動的にテキスト表現に変換します。デフォルトでは、この変換はリスト全体を括弧で囲み、リスト内のアイテムをカンマで区切ることで行われます。このフォーマット方法を変更するには、the listFormat グローバルプロパティprefixseparatorsuffix の値を設定します。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 // displays: '+rainysunny+'

リストがテキストに変換されると、リスト内の各値がテキスト表現に変換されます。これらの値の引用符を制御するには、the listFormat グローバルプロパティの quotes 値を設定します。このプロパティについての詳細は、the listFormat を参照してください。

テキストをリストに変換

splitjoinコマンドと関数、そして asText 関数は、テキストとの作業で詳述されており、対応する split byjoined 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

standardFormat関数を使用して、リストをテキストに変換します。このテキストは、value関数によって評価されると、元のリストを再度生成する形式になります。

例:

put ["peanut butter","bread","jelly"] into Sandwich
put standardformat(Sandwich) into newSandwich //Converts the list into text
put value(newSandwich) into Sandwich // Converts the text into a list

テキスト表現をリスト構造に変換

リストをテキストとしてアクセスするときに稀な状況で、putlogコマンドを使用すると、SenseTalkのリストをテキスト表現に自動変換する機能が、簡化されたが望ましくない構造を生成します。リスト構造を生成するためにasList()を使用し、SenseTalkがリストをリストのようなフォーマットで表示するようにします。詳細については、as operatorを参照してください。

例:

put "1".."9" into NumberList // creates a range
log NumberList // displays '1 to 9'
log NumberList as a list // displays '[1,2,3,4,5,6,7,8,9]'

chunk typesでテキスト項目を参照することは可能です。しかし、これはテキストがリストであることを意味しません。asList()関数はテキストをリストに変換することができ、項目の定義やアクセスの方法が変わります。

例:

put "A man, a plan, a canal. Panama!" into Palindrome // Stores the text string in a variable. This is not a list.
put the number of items of Palindrome // Returns 3 as there are 3 text items in the text, delimited by comma
put Palindrome is a list // Checks whether Palindrome is a list. Returns False, as the contents are text rather than a list.
put Palindrome as a list into PalindromeList // Stores the text as a list into a new variable
put PalindromeList is a list // Checks whether PalindromeList is a list. Returns True.
put the number of items of PalindromeList // Returns 1, as the list now just contains one item, 'A man, a plan, a canal. Panama!'

リスト内の値の自動変換

SenseTalkは型のない言語です。そのため、SenseTalkは、リストに格納された値を含む値を、適切な内部表現に自動的に変換します。

例:

put [5 pounds 3 ounces, ten feet 5 inches, 400 megabytes and 12 kilobytes] into ValuesList // Automatically converts the values in the list, resulting in the list '[5.1875 pounds,10.416667 feet,409612 kilobytes]'
put ["5 pounds 3 ounces","ten feet 5 inches","400 megabytes and 12 kilobytes"] into StringsList // The list contains text strings, which aren't converted. Results in the list '["5 pounds 3 ounces","ten feet 5 inches","400 megabytes and 12 kilobytes"]'.

リストの項目の置換

pull コマンドはリストから最初の値を削除し、変数に格納します。 pushpull コマンドはリストをキューとして扱います。 pull コマンドは push コマンドでキューに追加された順序でアイテムを一つずつ取得します。

ノート

: put intoとは異なり、put beforeコマンドとput afterコマンドはリストでの使用はほとんどありません。リストが宛先の場合、これらのコマンドの振る舞いは、リストの最初の項目または最後の項目の前後にテキスト値を連結することです。より一般的には、insert beforeコマンドとinsert afterコマンドを使用して、リストの前後に新しい項目を挿入することが求められます。

put intoコマンドまたはsetコマンドを使用して、一つ以上の新しい値をリストに入れると、宛先の全内容が新しい値で置き換えられます。最終結果はいくつかの形式をとることができます:

宛先コンテナが変数の場合、SenseTalkはその変数の以前の内容を破棄し、新しい値のコピーで置き換えます。

例:

put "good morning" into greetings
put ["hello","hola"] into greetings // Replaces the previous string stored in variable greetings
log greetings // Logs '[hello,hola]'

ソースが単一の値で、宛先がリスト内の単一の項目または項目の範囲である場合、その項目全体が新しい値に置き換えられます:

例:

put [1,2,3,4] into aList
put 99 into items 2 to 3 of aList // Results in the list '[1,99,4]'

新しい値が単一の値ではなくリストである場合、宛先が単一の項目である場合、結果はネストされたリストとなります:

例:

put ["hazel","black","blue"] into eyeColors
put ["green","brown"] into the first item of eyeColors // Results in the list '[[green,brown],black,blue]'

宛先が項目の範囲(1項目の範囲でも)である場合、それらの項目は新しい値で置き換えられます:

例:

put [1,2,3,4] into aList
put ["a","b","c"] into items 2 to 3 of aList // Results in the list '[1,a,b,c,4]'
put ["x","y"] into items 1 to 1 of aList // Results in the list '[x,y,a,b,c,4]'

これらの結果は、「項目ごと」または「ネスト」を明示的に指定することで制御できます:

例:

put [1,2,3,4] into aList
put ["a","b","c"] nested into items 2 to 3 of aList // Results in the list '[1,[a,b,c],4]'
set item 1 of aList to ["x","y"] item by item // Results in the list '[x,y,[a,b,c],4]'

先ほど説明したThe listInsertionModethe defaultListInsertionModeのプロパティは、宛先が項目の範囲であり、「ネスト」または「項目ごと」が明示的に指定されていない場合も適用されます(上記の一部の例は、これらのプロパティのデフォルト設定「項目ごと」を前提としています)。

インデックスのリストを指定して一度に複数の項目に値を格納することができます:

例:

set notes to ["c","d","e","f","g"]
put "#" after items [1,4] of notes // Results in the list ["c#","d","e","f#","g"]

例:

put ["taurus","gemini","andromeda","cygnus","ursa major"] into Constellations
set items [3,1] of Constellations to ["sagittarius","orion"] // Results in the list '[orion,gemini,sagittarius,cygnus,ursa major]'

一度に複数の項目に単一の値を格納することもできます:

例:

put [1,2,3,4] into aList
put "Egg" into items [6,4,2] of aList // Results in the list '[1,Egg,3,Egg,,Egg]'

リストからインデックスで項目を削除する

delete コマンドを使用して、リストから特定の文字や文字列を削除します。SenseTalkは、リストの各項目から指定された文字列を削除します。

例:

put [[100,100],[200,200],[300,300],[400,400],[500,500]] into MovetoLocations
delete item 4 of MovetoLocations // Results in the list '[[100,100],[200,200],[300,300],[500,500]]'

例:

put ["c","d","e","f","g"] into notes
delete the last 2 items of notes // Results in the list '[c,d,e]'

例:

put ["A","B","C","D","E","F","G","H","I"] into sections
put [2,6,8,4] into done — list of indexes to delete
delete items done of sections
put sections —> ["A","C","E","G","I"]

値によってリストから項目を削除する

delete each コマンドは、each表現を使用して、その値に基づいてリストから1つ以上の項目を削除するために使用できます。

例:

put ["c","d","e","f","g"] into notes
delete each item of notes which is "f" // Results in the list '["c","d","e","g"]'

例:

put [[100,150],[200,250],[300,350],[400,450],[500,550]] into MovetoLocations
delete each item of MovetoLocations where item 1 of each is a multiple of 200 // Results in the list '[[100,150],[300,350],[500,550]]'

例:

put [22,53,60,39,42,88,17,94,15] into scores
delete each item of scores which is less than 42
put scores —> [53,60,42,88,94]

リストから文字を削除する

deleteコマンドを使って、標準的なチャンク表現の構文を使用して、リストから1つ以上の項目をそのインデックス(位置)で削除します。単一の項目、範囲の項目、または項目のリストをこの方法で削除できます。

例:

put [[100,100],[200,200],[300,300],[400,400],[500,500]] into MovetoLocations
delete zero from MovetoLocations // Results in the list '[[1,1],[2,2],[3,3],[4,4],[5,5]]'
put ["red", "green", "blue", "orange", "yellow", "black"] into colors
delete "e" from colors
put colors —> ["rd","grn","blu","orang","yllow","black"]

リストの項目数を数える

number 関数を使用して、リスト内の項目の数を確認します。これは、項目数(ソースがリストであることがわかっている場合)または明示的にリスト項目の数(リストでない可能性がある場合)を求めることによります。

例:

put the number of items in [1,3,4,5,9] // Returns '5'

例:

put "Akron, OH" into City
put the number of list items of City // Returns '1'

リスト内の項目の位置を特定する

item number of ... within ...表現は、リスト内の値の項目番号を提供し、その項目がリスト内に見つからない場合はゼロを返します。

例:

put "a".."z" into AlphabetList
put the item number of "c" within AlphabetList // Returns '3'

item number containing ... within ...表現は、指定された値を含むリストの最初の項目の番号を返します。その値がリストに見つからない場合はゼロを返します。

put ["dog","cat","armadillo"] into Animalia
put the item number containing "c" within Animalia // Returns '2'

リストで算術演算を実行する

ベクトル算術はリストでサポートされています。

同じ長さの2つの数字のリストを足したり引いたりすることができます。このアプローチは、2つのリストの対応する項目を足したり引いたりします。ベクトル演算はネストしたリストでも動作します。

例:

put [12,4,6,22] into numList
add [1,2,3,4] to numList // Results in the list '[13,6,9,26]'

リストの乗算と除算も、同じ長さのリストで動作します。

例:

put [6,7,14,33] divided by [3,2,1,3] // Results in the list '[2,3.5,14,11]'
put [4,5,6] * [9,8,7] // Results in the list '[36,40,42]'

リストを単一の値で乗算または除算することもできます(これは「スカラ」と呼ばれることがあり、リスト内のすべての値をスケールします)。

例:

put [6,7,14,33] / 2 //Results in the list '[3,3.5,7,16.5]'

例:

put [12 pounds,15 pounds,13 pounds] into myCatsWeights
put .75 into DietRequirements
log myCatsWeights times DietRequirements // Results in the list '[9 pounds,11.25 pounds,9.75 pounds]'

リストの比較

比較演算子は、リストと単一の値とでは異なる方法でリストを扱います。=<><><=>=演算子はリストを項目ごとに処理し、個々の値を比較して等しさまたは不等しさを判断します。等しい場合、両方のリストに同じ数の項目が存在し、各一致するペアが等しくなければなりません。不等の場合、最初の不等なペアが順序を決定します。リストが等しくない長さで、短いリストの項目で等しい場合、長いリストは大きいと考えられます。リストと比較されるとき、平易な(非リスト)値は単一の項目を持つリストのように扱われます。

例:

put [3 - 2,02.00,A] = [1,2,"a"] // caseSensitiveが設定されていない場合はTrue
put [1,2,2] < [1,2,3] // True
put [1,2] is less than [1,2,0] // True
put [1,2,3] , [1,3] // True
put [1,2,3] < 5 // True, because 1 is less than

例:

put ["China","Japan","South Korea","Cambodia"] equals ["China","Japan","Cambodia","South Korea"] // False

begins with, ends with, is in, そして contains オペレータは、検索される値がリストである場合に、リスト内の全体の値または値のシーケンスの存在をすべてチェックします。これらのオペレータはすべて、ネストしたリストを深く見ます。探している値もリストである場合、その項目はリストまたはそのサブリスト内で同じ順序で表示される必要があります。

例:

put ["a","b","c"] begins with ["a","b"] // True
put ["a","b","c"] begins with "a" // True
put [1,2,3] ends with [2,3] // True
put [1,2,3] ends with 3 // True
put ["some","choice","words"] contains ["words","choice"] // False
put ["some","choice","words"] contains "word" // False
put [3,4]is in [[1,2],[3,4,5]] // True
put [2,3] is in [[1,2],[3,4,5]] // False (同じサブリストに存在しない)

"集合のような" リスト操作

これらの関数は、リスト内の値を集合のメンバーのように扱い、リストまたは2つのリストに対して「集合のような」方法で操作を行います。

例:

時々、SenseTalkは複雑なオブジェクトに対してテキスト表現を提供します。例えば、files() 関数は、各プロパティがファイルを表すオブジェクトであるプロパティリストのリストを返します。この例を考えると、それらのファイルの asText 表現を使って作業することが可能です。

put the unique items of [3,5,4,5,6,8,8,9,1,3] --> [3,5,4,6,8,9,1]

共通部分

Eggplant Functional 20.1以前では、リストとプロパティリストの両方がデフォルトで括弧 () を使用していました。四角括弧 [] や中括弧 (それぞれ)の代わりにです。括弧はプロパティリストの有効な構文として引き続き認識されますが、混乱を招く可能性があるため、その使用は推奨されません。

put the items of ["red","tan","blue","gray"] that are also in ["blue","green","red"] --> ["red","blue"]

和集合

union関数は、2つのリストのいずれかまたは両方に存在するすべてのアイテムを含むリストを返します。

put the union of ["red","tan","blue","gray"] and ["blue","green","red"] --> ["red","tan","blue","gray","green"]

アイテムの除外

プロパティリストを含むリストは、パラメータとして渡すことができます。リストをパラメータとして使用する詳細については、Parameters and Resultsを参照してください。

put the items of ["red","tan","blue","gray"] excluding those in ["blue","green","red"] --> ["tan","gray"]

リストの項目を反復処理する

リストの値それぞれでアクションを実行するために、repeat with each itemループを使ってリストの値を通ります。このアプローチは、it変数を順番にリストの値に設定します。

例:

repeat with each item of 1..5
log "The cubed value of "&it&" is"& it cubed
end repeat

it以外の変数を使用するには、itemの後に変数名を含めます:

例:

set TestList to ["regression","smoke","performance"]
repeat with each item Test of TestList
RunWithNewResults Test
end repeat

リストの項目を変更するために、その値を変更したり、それらを削除したりするために、by referenceを指定します。このアプローチは、ループ変数を値のコピーではなく、各項目への参照として設定します:

例:

set numList to [10,11,12,13,14,15,16]
repeat with each item of numList by reference
if it is an odd number then delete it
else divide it by 2
end repeat
put numList // リスト '[5,6,7,8]' を結果として表示

"each" 式を使用してリスト項目を選択する

each 式の使用により、値の選択したチャンクのリストを取得することが Extracting a List of Chunks で説明されています。同様に、リストから選択された項目のサブリストを抽出するためには、where節を伴うeach式を使用します:

例:

set numList to 9..16
put each item of numList where each is an odd number // リスト '[9,11,13,15]' を表示
put each item of numList where sqrt(each) is an integer // リスト '[9,16]' を表示

例:

set Locations to ["Lansing, Michigan","Portland, Oregon","Denver, Colorado","Fort Collins, Colorado"]
put each item of Locations where each contains "Colorado" into ColoradoCities // 二つの項目のリスト: '[Denver, Colorado,Fort Collins, Colorado]' を変数に格納
ノート

each 式についての詳細は、Each ExpressionsIterators を参照してください。

"each" 式を使用してリストに操作を適用する

これらの表現は複雑で、each表現からの各項目に対して複数の操作が適用されます。括弧で囲むことでeach表現の範囲が制限されます:括弧内の演算子はリストの各項目に適用され、括弧外の演算子はリスト全体に適用されます。

例:

set numList to [9,10,12,16]
put each item of numList + 3 // リスト'[12,13,15,19]'を表示します
put sqrt of each item of numList // sqrt()関数を使用して元のリスト内の各数値の平方根を計算し、結果のリスト'[3,3.162278,3.464102,])'を表示します
put each item of numList * [2,9,3,4] // リスト'[[18,81,27,36],[20,90,30,40],[24,108,36,48],[32,144,48,64]]'を表示します

例:

put [1000 dollars, 5500 dollars, 3600 dollars] into InitialSavings
put each item of InitialSavings * compound(.95%,12) rounded to 2 into FinalSavings // compound()関数を使用して利息を計算し、結果のリスト'[$1120.15,$6160.82,$4032.54]'をFinalSavings変数に格納します

リスト内の各項目に対して操作を行い、その結果の値のリストを得るには、each表現(where節を含むかどうか)をより大きな表現の要素として使用します:

リスト内の項目をソートする

リストをソートするには、sortコマンドまたはsorted演算子を使用します。リストのソートは次のように簡単に行うことができます:

例:

set planets to ["Mars","Saturn","Venus","Earth"]
sort planets // myListの項目を昇順(アルファベット順)にソートします。結果はリスト'[Earth,Mars,Saturn,Venus]'です。
put planets --> [Earth,Mars,Saturn,Venus]

追加のソートオプションも指定できます。これには、順序の指定や、リスト内のリストのプロパティ値を評価するオプションが含まれます(詳細はSort commandの説明を参照してください):

例:

put [{age:14,name:"Monica"},{age:22,name:"Brad"},{age:9,name:"Sam"},{age:12,name:"Michael"}] into siblings //これはプロパティリストのリストです
sort siblings in descending numeric order by the age of each // 結果はリスト'[{age:"22", name:"Brad"},{age:"14", name:"Monica"},{age:"12", name:"Michael"},{age:"9", name:"Sam"}]'です。
put siblings --> [{age:"22", name:"Brad"},{age:"14", name:"Monica"},{age:"12", name:"Michael"},{age:"9", name:"Sam"}]

リストをその場でソートするためには、sorted演算子を使用できます:

例:

put [90,88,92,98,91] into Scores
put the first three items of (Scores sorted in decreasing order) // リスト'[98,92,91]'を表示します。

リスト内の項目を反転またはシャッフルする

リストは、Reverseコマンドまたは関数を使用して反転できます。

put the reverse of ["extreme","high","medium","low","trivial"] —> ["trivial","low","medium","high","extreme"]

リスト内の項目は、Shuffleコマンドまたは関数を使用してランダムな順序にシャッフルできます。

put ["apples","oranges","tomatoes","cereal"] shuffled —> ["oranges","tomatoes","cereal","apples"]