チャンクの操作
チャンクへの格納
チャンク式は、値の一部へのアクセスに加えて、値の一部に格納するのにも使用できます(アクセス対象がコンテナである場合)。
put "Jack Peterson" into name
put "d" into char 3 of last word of name
put "e" into char -2 of name
put "Olaf" into first word of name
put name -- "Olaf Pedersen"
チャンクの前後に値を格納することも可能です。
put "The plant is growing" into phrase
put "egg" before word 2 of phrase
put " purple" after word 1 of phrase
put phrase -- "The purple eggplant is growing"
チャンク範囲への格納
チャンク範囲に格納する場合は、範囲全体が置換されます。
put "The great grey green gooey goblin" into monster
put "ugly" into words 2 to 5 of monster
put monster-- "The ugly goblin"
パターンによるチャンクへの格納
パターンと一緒にoccurrenceとmatchを使用することで、ソース文字列内で一致する範囲への格納など、その他のチャンクタイプと同じようにチャンクに格納できます。
set text to "[a]hello[b]bonjour[c]hola[d]"
set marker to <"[", character, "]">
put occurrences 2 to 3 of marker in text --> ([b],[c])
put "$$$" into occurrences 2 to 3 of marker in text
put text --> [a]hello$$$hola[d]
パターンの使用に関する情報は、SenseTalkのパターン言語の基本をご覧ください。
存在しないチャンクへの格納
put "mercury,venus,mars" into gods
put "saturn" into item 5 of gods
put gods-- "mercury,venus,mars,,saturn"
本例では、単語saturnがテキストアイテムを3つしか持っていなかった値の5番目のテキストアイテムになりました。 要求に対応するために、単語saturnの前に2つの追加コンマが自動的に挿入され、saturnが新たに5番目のアイテムとなっています。 挿入される実際の文字は、the itemDelimiterプロパティの現在の設定と一致します。
リストの末尾を超えるリストアイテムを格納する場合も、結果は同様になります。
put (dog, cat, mouse) into pets
put rabbit into item 7 of pets
put pets-- (dog,cat,mouse,,,,rabbit)
行についても、その挙動はテキストアイテムにおける挙動とほぼ同じです。 しかし、the lineDelimiterは、新しい行を示すことのできる複数の区切り文字のリストである可能性があるため、挿入する区切り文字を指定するのに使用することはできません。 代わりに、the lineFillerと呼ばれる別のグローバルプロパティが必要な数だけ挿入される区切り文字列(デフォルトではリターン)を指定し、テキストが要求された行数を満たせるようにします。
テキストの末尾を超える単語のチャンクについては、シンプルな区切り文字の利用だけでは十分ではありません。 単語の区切り文字は空白文字とすることができるため、スペースを更に挿入するだけでは単語は追加されません。 そのため、the wordFillerグローバルプロパティがプレースホルダーの「単語」(デフォルトでは「?」)を指定してスペースと一緒に挿入し、テキストが希望する単語数を満たせるようにします。
put "one two three" into someWords
put "seven" into word 7 of someWords
put someWords-- "one two three ? ? ? seven"
文字のチャンクについては、the characterFillerグローバルプロパティが必要に応じて繰り返されるテキスト(デフォルトでは「.」)を指定し、テキストが希望する文字位置を満たせるようにします。
put "abcdefg" into alpha
put "z" into character 26 of alpha
put alpha-- "abcdefg..................z"
チャンク数よりも大きい負のチャンク数を使用する場合は、結果は上述したすべてのチャンクタイプと同様になりますが、想定通りの結果を得るために、埋め字や区切り文字が値の先頭に追加されます。
put "abc" into backfill
put "X" into character -7 of backfill
put backfill-- "X...abc"
関連するグローバルプロパティ
上述したように、チャンク式を使用して現在の制限を超えて拡張されるチャンクに文字や行、単語を追加する場合に、SenseTalkではグローバルプロパティによってフィラーテキストが提供されます。 これらの3つのプロパティ(the characterFiller、the lineFillerおよびthe wordFiller)については、チャンク式向けのローカルプロパティとグローバルプロパティにおいて詳細に説明します。
複数チャンクへの格納
チャンク数のリストを指定すると、複数のチャンクに一度に格納できます。
put "The great grey green gooey goblin" into monster
put "G" into chars (5,11,16,22,28) of monster
put monster-- "The Great Grey Green Gooey Goblin"
チャンク数の他に値のリストも指定すると、複数の値を一度に格納できます。
put ("Old","Ugly") into words (5,2) of monster
put monster -- "The Ugly Grey Green Old Goblin"
チャンクの削除
コンテナのチャンクは格納できるだけではなく、削除することも可能です。 削除は、deleteコマンドによって実行します(テキストおよびデータ操作を参照)。
例:
put (dog, cat, gorilla, mouse) into pets
delete item 3 of pets-- (dog, cat, mouse)
例:
put "My large, lumpy lout of a lap dog is lost."into ad
delete words 2 to 7 of ad-- "My dog is lost."
チャンクのカウント
ある値の中に含まれる所定のチャンクタイプの数を確かめるには、number関数を使用します。
例:
get the number of characters in "extraneously"-- 12
例:
put number of words in "I knew an old woman"-- 5
例:
if the number of items in list is less than 12 then ...
number関数
挙動:number関数は、文字、単語、行、テキストアイテム、リストアイテム、キー、値、または値中のバイトの数をカウントします。 本関数は、ある値の中に含まれる特定のチャンクタイプの数を確かめる必要がある場合にはいつでも使用します。 値がemptyの場合は、結果は常に0となります。 通常のテキストチャンクやバイトに加えて、式がオブジェクトまたはプロパティリストの場合は、オブジェクト内で定義されるキーまたは値の数をカウントするのに、chunksを「keys」または「values」とすることができます。
構文:
例:
put "I wept because I had no answers, until I met a man who had no questions."into quote
put the number of characters in quote-- 72
put the number of words in quote -- 16
put the number of items in quote-- 2
put the number of lines in quote-- 1
チャンク値の存在を検証する
is amongまたはis not among演算子を使用して、特定の値が別の値のチャンクの1つとして存在するかどうかを確かめることができます。
is among演算子
挙動:is among演算子は、特定の値が文字、単語、行、テキストアイテム、リストアイテム、キー、値、または値中のバイトの中に存在するかどうかを検証します。 本演算子は、ターゲット値が指定されたいずれかのチャンクと等しい場合にのみtrueを返します。 本演算子は、あるテキスト文字列が別のテキスト文字列の従属文字列であるかどうかだけを検証するis inまたはcontains演算子とは対照的です(2つ目の例を参照)。 通常のテキストチャンクに加えて、式がオブジェクトまたはプロパティリストの場合は、ターゲット値がオブジェクトのいずれかのキーまたは値であるかどうかを検証するのに、chunksを「keys」 または「values」とすることができます。
構文:
例:
put "be" is among the words of "To be or not to be" -- true
例:
put "be" is among the words of "I believe I am a bee"-- false
例:
put 7 is among the items of (5,5+1,5+2,5+3) -- true
例:
put "M" is not among the characters of "Avogadro"-- true
値のチャンク位置を決定する
文字、単語、行、テキストアイテム、およびリストアイテムが値内で存在する順序を検出できます(検索は「considering case」または「with case」が指定されていない限り、大文字と小文字は区別されません)。 ターゲット式が検出されない場合は、値0が返されます。
構文:
{{the} chunk number containing ターゲット値 within ソース値 {considering case | ignoring case}
例:
put "The rain, in Spain, is mainly in the plain" into text
put the character number of "t" within text-- 1
put character number of "t" within text considering case-- 34
put the text item number of " in Spain" within text-- 2
put the word number of "mainly" within text-- 6
put the line number of "another line" within text -- 0
(値と等しい単語、行、またはアイテムではなく)値を含む単語、行、またはアイテムの数を検出するには、ofの代わりにcontainingを使用します。
put the word number of "main" within text-- 0
put the word number containing "main" within text -- 6
put the text item number containing "Spain" within text-- 2
チャンク値のオカレンスをカウントする
特定のチャンク値がソース値内に表れる回数をカウントするには、number of occurrencesまたはnumber of instances関数を使用します。
構文:
例:
put the number of occurrences of "a" among the chars of "banana"-- 3
例:
put the number of instances of "be" among the words of "to be or not to be"-- 2
例:
put the number of occurrences of 15 among the items delimited by "-" of "315-15-4152"-- 1
特定のチャンクタイプに名前が付いていない場合は、ソース値がリストまたはオブジェクトでない限り文字が想定され、ソース値がリストまたはオブジェクトの場合は、リストアイテムまたはプロパティ値がそれぞれ想定されます。
put number of occurrences of "a" in "banana" -- 3
例:
put the number of instances of 3 in (1,3,5,6,3,2)-- 2
例:
put number of occurrences of "Do" in "Do,re,mi,do" -- 2
大文字と小文字を区別して比較するには、「considering case」オプションを使用するか、caseSensitiveプロパティをtrue に設定します。
例:
put number of instances of "Do" in "Do,re,mi,do" considering case-- 1
特別なケースとして、単一文字のオカレンスをカウントするだけではなく、文字のシーケンスをカウントするのにも「among the characters of」を利用できます。
例:
put number of instances of "na" among the chars of "banana" -- 2
値の中のすべてのチャンクを反復処理する
値に含まれるチャンクごとにアクションを実行するには、repeatコマンドのrepeat with each形式を使用します(スクリプト構造と制御フローの説明も参照)。
例:
repeat with each line in file "/tmp/output"
if the first word of it is "Error:" then put it
end repeat
Each式を使ったチャンクリストの抽出
eachチャンクタイプofソース値形式の式により、指定されたタイプのすべてのチャンクを含むリストが生成されます(チャンクタイプを省略する場合は、itemが想定されます)。
構文:
例:
put each character of "Sweet!" -- ("S","w","e","e","t","!")
例:
put each word of "Wisdom begins in wonder" -- ("Wisdom","begins","in","wonder")
さらに興味深いことに、each式をより大きな式の一部とすることができます。 より大きな式において、演算子はリスト全体ではなく、リストの各アイテムに適用されます。
例:
put "Z" & each character of "Cat" -- ("ZC","Za","Zt")
例:
put 2 + each item of "1,2,5,6" -- (3,4,7,8)
例:
put the length of each word in "Wisdom begins in wonder"-- (6,6,2,6)
put each word of "Wisdom begins in wonder" begins with "w" -- (true,false,false,true)
丸括弧はより大きなeach式の範囲を制限し、その挙動が個々のアイテムではなく、リスト全体への適用に制限されます。
例:
put sum of the length of each word in "Wisdom begins in wonder" -- (6,6,2,6)
put sum of (the length of each word in "Wisdom begins in wonder") -- 20
また、each式にwhere句を組み込むことで、リスト内のアイテムのサブセットを選択できます。 単語eachをwhere句内で使用して、各ソースアイテムを参照できます。
例:
put each word of "Wisdom begins in wonder" where each begins with "w" -- ("Wisdom","wonder")
例:
put each item of (1,2,3,4,5,6,7,8,9) where the square root of each is an integer -- (1,4,9)
関連: