リスト
リストおよびプロパティリストは、スクリプト内でデータをまとめて操作するための便利で強力な方法です。このセクションでは、リストの能力を最大限活用するために知っておかなければならない主要事項を説明します。
リストの扱い方に関する詳細はチャンク式を、制御構造についてはRepeat with Eachをご覧ください。
リストを作成する
スクリプト内でリストを作成するには、2つ以上の式を列記してコンマで区切り、それを括弧で囲みます。リストは必ず括弧または波括弧に入れなければなりません。こうすることにより、リストの構文が明確で一貫したものとなり、ネストされたリストの構築も容易になります。
例:
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")
例:
put "a".."z" into AlphabetList
さらに長いリストの場合、波括弧{ }で囲むことにより、複数行にまたがるリストにすることができます。
set searchPaths to {
"/Library/WebServer/Documents",
"~/Documents",
"/Users/hemingway/Documents/temp/ImportantStuff" }
技術トピック
構文: ( {expr { , expr}... } )
{ {expr { , expr}... } }
{an} empty list
ここで、exprは、ネストされたリストを含むあらゆる式を取ることができます。もしくはこれを省略しても構いません。いずれかのexprが省略され、間に何もないコンマの連続が残された場合、SenseTalkは空のアイテムを作成します。SenseTalkは、リストの終わりにある最後のコンマは無視します。
リストの中身
リストには、他のリストやプロパティリストを含む、あらゆる種類の値を入れることができます。リストを構築する際に式を使うことも可能です。
例:
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)」を変数に格納します
シングルアイテムリスト
スクリプト内で1つの値を括弧で囲むと、その括弧がグループ化演算子として扱われるため、値はリストとして扱われません。括弧に入った1つのアイテムをリストとしてSenseTalkに認識させるためには、値の後ろにコンマを入れます。
例:
put (12,) into shortList // これで1つのアイテムを含んだリストになります
ほとんどの用途では、1つのアイテムを含んだリストは、1つの(リストではない)値と同じように扱われます。例えば、myListが(4)、つまり数値4という1つのアイテムを含んだリストである場合に、put myList + 2 into theSumを使用すると、 theSumに数値6が格納されます。通常、こうしたリストにテキストとしてアクセスすると、値が括弧に入って表示されます。これを避けるためには、the listFormatのprefixおよびsuffixプロパティをemptyに設定します。
空のリスト
空のリストを作成するには、空の括弧を1組使うか、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コマンドに若干似ているコマンドですが、宛先コンテナを常にリストとして扱います。
例:
put "abc" into myList // 変数にabc(実際にはリストではない)を格納します
put "de" after myList // abcにdeを追加してabcdeにします(これもリストではありません)
insert "xyz" after myList // xyz文字列の挿入により直ちにリストが作成され、(abcde,xyz)になります
insert 24 before item 2 of myList // リスト内に追加のアイテムが挿入され、(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 // 「First, let's connect to our SUT. Next let's enter Capture Mode.」を表示します。コンマの位置によって4アイテムリストに見えますが、実際には2アイテムリストです
set the listFormat to (prefix:"(",suffix:")",separator:"|") // コンマではなく | でリストアイテムを区切るようthe listFormatを変更します
put instructions // (First, let's connect to our SUT.|Next, let's enter Capture Mode.)と表示され、リスト内のアイテムが4つではなく2だけということが明確になります
アイテムのリストを別のリストに挿入する場合、方法は2種類あります。デフォルトモード(「item by item」)では、元のリストの各アイテムが宛先リストに挿入されます。
例:
put (1,2,3,4) into list // (1,2,3,4)
insert (A,B) after item 2 of list // Item 2 of list // -- (1,2,A,B,3,4)
また、nestedキーワードを使い、別のリスト内にリストを挿入し、ネストされたリストを作成することも可能です。
例:
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))
より詳しい情報は、insertコマンドをご覧ください。
Push、Pull、 Pop
pushコマンドは、insertコマンドと同義です。popコマンドは、リストから最後の値を取り除いて、それを変数に格納します。pushコマンドとpopコマンドは、リストをスタックとして扱います。スタックに押し出されたアイテムは、popコマンドによって逆の順序で取り出すとができます。
例:
put ("carrots","bananas","pistachios") into GroceryList
pop GroceryList into gList
put gList // 「pistachios」を返します
pullコマンドは、リストから最初の値を取り除いて、それを変数に格納します。pushコマンドとpullコマンドは、リストをキューとして扱います。pullコマンドは、pushコマンドによってキューに追加されたときと同じ順序でアイテムを1つずつ取り出します。
例:
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」を返します
リストを結合する
2つのリストを1つ(ネストなし)のリストに結合するには、&&&演算子を使います。
例:
put (3,4,5) into tr1 // (3,4,5)
put (5, 12,13) into tr2 // (5,12,13)
put tr1 &&& tr2 into longList // ネストのない1つのリスト(3,4,5,5,12,13)を作成します
put (tr1,tr2) into twoTriples // 2つのリストから成るネストされたリスト((3,4,5),(5,12,13))を作成します
リストアイテムにアクセスする
リスト内のアイテム(アイテムの範囲、アイテムのリストを含む)へのアクセスはすべて、itemおよびitemsチャンク式(または、より明示的な形であるlist itemおよびlist items)を使って行うことができます。1つのアイテムにアクセスすると、そのインデックスのアイテムが得られます。アイテムの範囲にアクセスすると、必ずリストが生成されます。範囲で1つのアイテムを指定した場合でも同様です。
例:
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)
例:
put ("cheddar","provolone","brie","muenster","mozzarella") into CheeseList
put the penultimate item of CheeseList // muensterを表示します
put item random(5) of CheeseList // リストからランダムなアイテムを出力します
log "My favorite cheese is" & the third item of CheeseList & period // 「My favorite cheese is brie.」を表示します
itemという語は、対象の変数がリストであると分からない場合、リストアイテムではなくテキストアイテムをデフォルトで参照します。明示的な形であるlist itemを使うと、必ず変数をリストとして扱います。これは、変数にリストでない値が格納されている場合でも同様です(その場合、その値を格納したシングルアイテムリストのように扱います)。
例:
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演算子(式を参照)を使うと、テキストからリストへ、リストからテキストへの変換を明示的に行うことができます。
例:
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")
log items 2 to 3 of Weather // リストをテキスト表現に変換し、「+rainysunny+」を表示します
リストがテキストに変換されると、リスト内の各値はテキスト表現に変換されます。これらの値の引用について操作するときは、the listFormatグローバルプロパティのquotes値の設定を行います。このプロパティの詳細は、the listFormatをご覧ください。
時にSenseTalkは、複雑なオブジェクトである対象にテキスト表現を与えることがあります。例えば、files()関数は、プロパティリストのリストを返すもので、その1つ1つのプロパティが各ファイルを表すオブジェクトになっています。この例で考えた場合、これらのファイルをやむを得ずプロパティリストとして扱う代わりに、asText表現で扱うことが可能なのです。
例:
put the files of resourcepath() into files // スイートのResourcesセクション内にある各ファイルを表すプロパティリストオブジェクトのリストを格納します
put files // リスト内の各ファイルオブジェクトのasText表現を表示します。すなわち、 '(locations.txt,parameters.txt,testcase1.txt,testcase2.txt,testcase3.txt,testcase4.txt)'.
repeat with each myFile of files // リスト内の各プロパティリストベースで繰り返します
if myFile's NSFileSize is greater than 10 then // 実際に扱っているのはテキスト文字列ではなくオブジェクトのため、プロパティリストの個別のキーにアクセスすることは依然として可能です
put file resourcepath(myFile) // SenseTalkがResourcePath()関数によって適当な表現を自動的に使用し、ファイルの中身へのアクセスを可能にします
end if
end repeat
テキストをリストに変換する
splitおよびjoinコマンド/関数、asText関数(詳細はテキストを扱うを参照)、そして対応するsplit byおよびjoined by演算子(式を参照)を使うと、テキストからリストへ、リストからテキストへの変換を明示的に行うことができます。
例:
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) // リスト「(1 ounce,0.6 ounces,2.8 ounces)」を表示します
put line 1 of file resourcePath("sizes.txt") into SizesFile // sizes.txtファイルの1行目には「2 ounces,3 ounces,4 ounces」が格納されていて、これはテキスト文字列です
put SizesFile * (.5,.2,.7) // 入力の中身が数値ではなく、SenseTalkが値を取れないため、これを実行するとSenseTalkコードによって例外が投げられます
リストをテキストに変換する際、value関数によってテキストを評価すると元のリストが再び生成されるようなフォーマットで変換を行うには、standardFormat関数を使用します。
例:
put ("peanut butter","bread","jelly") into Sandwich
put standardformat(Sandwich) into newSandwich // リストをテキストに変換します
put value(newSandwich) into Sandwich // テキストをリストに変換します
テキスト表現をリスト構造に変換する
putまたはlogコマンドなど、リストにテキストとしてアクセスする稀な状況では、SenseTalkがリストをテキスト表現に自動変換することにより、意図とは異なる簡略化された構造が生じます。要望に沿ったリスト構造を生成し、SenseTalkに当該リストをリストに似たフォーマットで表示させるためには、asList()を使用します。詳細については、as演算子をご覧ください。
例:
put "1".."9" into NumberList // (1,2,3,4,5,6,7,8,9)というリストを作成します
log NumberList // 「1 to 9」を表示します
log NumberList as a list // 「(1,2,3,4,5,6,7,8,9)」を表示します
チャンクの種類では、テキストアイテムを参照できますが、 これはそのテキストがリストだという意味ではありません。テキストをリストに変換することによって、アイテムの定義やアクセス方法を変更するには、asList()関数を使うことができます。
例:
put "A man, a plan, a canal. Panama!" into Palindrome // 変数にテキスト文字列を格納します。これはリストではありません
put the number of items of Palindrome // テキスト内にコンマで区切られたテキストアイテムが3つあるため、3を返します
put Palindrome is a list // Palindromeがリストかどうかをチェックします。中身はリストではなくテキストのため、falseを返します
put Palindrome as a list into PalindromeList // テキストを新しい変数にリストとして格納します
put PalindromeList is a list // PalindromeListがリストかどうかをチェックします。trueを返します
put the number of items of PalindromeList // リストには「A man, a plan, a canal. Panama!」という1つのアイテムのみが格納されているため、 1を返します
リスト内の値を自動変換する
SenseTalkは型なし言語です。そのため、SenseTalkは値(リストに格納された値を含む)を適当な内部表現へと自動的に変換します。
例:
put (5 pounds 3 ounces,ten feet 5 inches,400 megabytes and 12 kilobytes) into ValuesList // リスト内の値が自動変換され、リスト(5.1875 pounds,10.416667 feet,409612 kilobytes)になります
put ("5 pounds 3 ounces","ten feet 5 inches","400 megabytes and 12 kilobytes") into StringsList // リストには文字列が格納されていて、これは目に見える形では変換されず、 「(5 pounds 3 ounces,ten feet 5 inches,400 megabytes and 12 kilobytes)」というリストになります
リスト内のアイテムを置き換える
insertコマンドはリストを扱うために特別に用意されたコマンドですが、リストに新しい値を追加することしかできません。リスト内の既存のアイテムを新しい値に置き換えるときは、setまたはput intoコマンドを使います。
put intoまたはsetコマンドを使って1つまたは複数の新しい値をリスト内に入れると、宛先の中身全体が新しい値に置き換わります。最終的な結果としては、次のようないくつかの形があり得ます。
宛先コンテナが変数の場合、SenseTalkは変数のそれまでの中身を破棄し、新しい値のコピーに置き換えます。
例:
put "good morning" into greetings
put ("hello","hola") into greetings // 変数greetingsに格納されていた前の文字列を置き換えます
log greetings // 「(hello,hola)」をログします
ソースが1つの値で、宛先がリスト内の1つのアイテムまたはアイテムの範囲である場合、それらのアイテムが丸ごと新しい値に置き換わります。
例:
put (1,2,3,4) into aList
put 99 into items 2 to 3 of aList // 「(1,99,4)」というリストになります
新しい値が1つの値ではなくリストであって、宛先が1つのアイテムである場合は、ネストされたリストになります。
例:
put ("hazel","black","blue") into eyeColors
put ("green","brown") into the first item of eyeColors // 「((green,brown),black,blue)」というリストになります
宛先がアイテムの範囲である場合は(その範囲が1アイテムであっても)、これらの値が新しい値に置き換わります。
例:
put (1,2,3,4) into aList
put ("a","b","c") into items 2 to 3 of aList // 「(1,a,b,c,4)」というリストになります
put ("x","y") into items 1 to 1 of aList // 「(x,y,a,b,c,4)」というリストになります
こうした結果は、「item by item」または「nested」を指定することで、明示的に操作することができます。
例:
put (1,2,3,4) into aList
put ("a","b","c") nested into items 2 to 3 of aList // 「(1,(a,b,c),4)」というリストになります
set item 1 of aList to ("x","y") item by item // 「(x,y,(a,b,c),4)」というリストになります
前に説明したlistInsertionModeおよびdefaultListInsertionModeプロパティは、宛先がアイテム範囲で、「nested」または「item by item」が明示的に記載されていない場合も適用されます(上記の一部の例では、これらのプロパティにデフォルトの「item by item」が設定されていると仮定しています)。
格納先のインデックスのリストを指定すると、一度に複数のアイテムに値を格納することができます。
例:
set notes to "c,d,e,f,g"
put "#" after items (1,4) of notes // 「(c#,d,e,f#,g)」というリストになります
例:
put ("taurus","gemini","andromeda","cygnus","ursa major") into Constellations
set items (3,1) of Constellations to ("sagittarius","orion") // 「(orion,gemini,sagittarius,cygnus,ursa major)」というリストになります
1つの値を一度に複数のアイテムに格納することも可能です。
例:
put (1,2,3,4) into aList
put "Egg" into items (6,4,2) of aList // 「(1,Egg,3,Egg,,Egg)」というリストになります
リストからアイテムを削除する
リストから1つアイテムまたはアイテムの範囲を削除するときは、標準的なチャンク式の構文と併せてdeleteコマンドを使用します。
例:
put ((100,100),(200,200),(300,300),(400,400),(500,500)) into MovetoLocations
delete item 4 of MovetoLocations // 「((100,100),(200,200),(300,300),(500,500))」というリストになります
例:
put ("c","d","e","f","g") into notes
delete the last 2 items of notes // 「(c,d,e)」というリストになります
リストから文字を削除する
リストから特定の文字または文字列を削除するときも、deleteコマンドを使用します。SenseTalkは、リスト内の各アイテムから指定の文字列を削除します。
例:
put ((100,100),(200,200),(300,300),(400,400),(500,500)) into MovetoLocations
delete zero from MovetoLocations // 「((1,1),(2,2),(3,3),(4,4),(5,5))」というリストになります
リスト内のアイテムを数える
リスト内に何個のアイテムがあるか突き止めるには、number関数を使って、アイテムの数を要求するか(リストであることが分かっている場合)、またはリストアイテムの数を明示的に要求します(リストではない可能性がある場合)。
例:
put the number of items in (1,3,4,5,9) // 「5」を返します
例:
put "Akron, OH" into City
put the number of list items of City // 「1」を返します
リスト内のアイテムの位置を決定する
item number of ... within ...式を使うと、リスト内のある値のアイテム番号が得られます。そのアイテムがリストに見つからないときはゼロが返されます。
例:
put "a".."z" into AlphabetList
put the item number of "c" within AlphabetList // 「3」を返します
item number containing ... within ...式を使うと、リスト内で指定の値を含んだ最初のアイテムの番号が得られます。その値がリストに見つからないときはゼロが返されます。
put ("dog","cat","armadillo") into Animalia
put the item number containing "c" within Animalia // 「2」を返します
リスト上で算術演算を行う
リストでは、ベクトル演算がサポートされています。
2つの数値リストの長さが同じであれば、その2つのリストを足したり引いたりすることが可能です。この加算/減算は、2つのリストの対応するアイテム同士で行われます。ベクトル演算は、ネストされたリストでも機能します。
例:
put (12,4,6,22) into numList
add (1,2,3,4) to numList // 「(13,6,9,26)」というリストになります
リスト同士の乗算や除算も、リストの長さが同じ場合に機能します。
例:
put (6,7,14,33) divided by (3,2,1,3) // 「(2,3.5,14,11)」というリストになります
put (4,5,6) * (9,8,7) // 「(36,40,42)」というリストになります
1つの値を使ってリストを掛けたり割ったりすることもできます(リスト内のすべての値をスケーリングするため「スカラー」と呼ばれることがあります)。
例:
put (6,7,14,33) / 2 // 「(3,3.5,7,16.5)」というリストになります
例:
put (12 pounds,15 pounds,13 pounds) into myCatsWeights
put .75 into DietRequirements
log myCatsWeights times DietRequirements // 「(9 pounds,11.25 pounds,9.75 pounds)」というリストになります
リストを比較する
比較演算子は、単独の値のときとは異なる方法でリストを扱います。=、<>、<、 >、<=および>=演算子は、リストのアイテムごとにくまなく適用され、個々の値を比較して、等価性/非等価性を判断します。等しいと判断されるには、両方のリストに同じ数のアイテムがあり、それぞれの対応する組が等しくなければなりません。等しくない場合、等価でない最初のアイテム組で序列が決まります。リスト同士の長さが等しくないものの、短い方のリスト内の各アイテムが等価の場合、長い方のリストの方が大きいと判断されます。プレーンな(リストではない)値は、リストと比較されるときには、1つのアイテムを含んだリストのように扱われます。
例:
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 // 1の方が小さいのでTrue
例:
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(同じサブリスト内にないため)
リスト内のアイテムにわたって繰り返す
リスト内のそれぞれの値を用いてアクションを実行するときは、repeat with each itemループを使うと、リスト内の値を1つ1つ使用していくことができます。この方法では、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式を使って、選択したチャンクのリストを値から得る方法が説明されています。同じように、選択したアイテムのサブリストをリストから抽出する場合も、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 // 2アイテムリスト:「(Denver, Colorado,Fort Collins, Colorado)」を変数に格納します
「each」式を使ってリストに演算を適用する
リスト内の各アイテムに演算を行い、結果の値のリストを得るには、より大きな式の要素としてeach式(where節あり/なし)を使用します。
例:
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,4)」を表示します
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式からの各アイテムに複数の演算が適用され、複雑化することがあります。括弧で囲むと、each式の範囲が制限されます。括弧内の演算子はリストの各アイテムに適用され、括弧外の演算子は全体としてリストに適用されます。
リスト内のアイテムを並べ替える
リストを並べ替えるには、sortコマンドまたはsorted演算子を使用します。リストの並べ替えは、次のように簡単に行うことができます。
例:
set planets to ("Mars","Saturn","Venus","Earth")
sort planets // リストのアイテムを並べ替えて昇順(アルファベット順)にします。その結果、「(Earth,Mars,Saturn,Venus)」というリストになります
他にも、順序を指示したり、リスト内にある各リストのプロパティ値を評価するオプションを指示したりといった、並べ替えのオプションを指定できます(詳細は Sortコマンドの説明を参照)。
例:
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"))」というリストになります
sorted演算子を使うと、オンザフライでリストを並べ替えることができます。
例:
put (90,88,92,98,91) into Scores
put the first three items of (Scores sorted in decreasing order) // リスト「(98,92,91)」を表示します