範囲
範囲の定義
SenseTalkでは範囲を使って値の範囲を示します。範囲は開始値と終了値を指定し、2つの値の間にダブルドット演算子(2つのピリオド)またはto
を使って指定します。
Syntax:
{from} startValue [ to | .. ] endValue { [{step{ping}} {down} by | step] stepvalue }
例:
put 1 to 100 into firstHundred
set validRange to 100..200
範囲にはオプションでステップ値を含めることができ、by
、step
、step by
を使用します(ステップ値の使用は以下の"Using a Range to Generate a List"で説明されています):
例:
put 1 to 99 step by 2 into oddNumbers
set evenNumbers to 0..100 by 2
範囲の単純な使用法
最も単純な使用法では、範囲は2つの値を指定します。start
とend
の値を範囲のプロパティとして直接アクセスします:
例:
set myRange to 10 .. 20 -- 10 to 20
put myRange.start --> 10
put myRange's end --> 20
add 15 to the end of myRange
put 10 is within myRange -- Puts "true"
is within
演算子を使用して、他の値が範囲内にあるかどうかをテストします:
例:
set myRange to 10 .. 20 -- 10 to 20
put 13 is within myRange -- Puts "true"
put 18.975 is within myRange -- Puts "true"
put 9.2 is within myRange -- Puts "false"
範囲は_包含的_であり、つまり、開始値と終了値の両方を含みます。したがって、10と20の間の任意の値(10と20を含む)は、例の範囲内にあります:
例:
set myRange to 10 .. 20 -- 10 to 20
put myRange.start -- 10
put myRange's end -- 20
is a range
演算子を使用して、値が範囲であるかどうかをテストします:
例:
put myRange is a range -- Puts "true"
範囲を使用してリストを生成する
範囲をシーケンスジェネレータとして使用し、範囲の開始値から始まり、その終了値まで自動的にシーケンスまたはリストの値を生成します。範囲がその値を生成する最も簡単な方法は、リストが期待されるコンテキストで範囲を使用することです:
例:
put item 5 of 10 to 20 -- 14
put the last 3 items of 100..200 by 2 -- Puts [196,198,200]
範囲のステップバイインクリメントを指定すると、その絶対値(正)がシーケンスを生成する際のリスト内の連続するアイテム間のインクリメントとして使用されます。範囲のステップバイインクリメントを指定しない場合、値は1が想定されます。範囲のstep
プロパティを使用して、範囲のインクリメント値にアクセスしたり変更したりします:
例:
set the step of myRange to 3
範囲のすべての値を一度に生成するには、as list
演算子を使用してリストとして要求します:
例:
put 10.. 20 as a list -- Puts [10,11,12,13,14,15,16,17,18,19,20]
put 10 to 20 by 2 as list -- Puts [10,12,14,16,18,20]
範囲の端点を任意の順序で指定できます。例えば、10から20の範囲や20から10の範囲としてです。is within
演算子の目的にとっては、これらは同等です。違いは、範囲がリストとして扱われたり、イテレータとして使用されたりした場合の値が生成される順序です。
例:
put 20 .. 10 by 2 as a list -- Puts [20,18,16,14,12,10]
範囲とともにcontains
およびis in
演算子を使用する
contains
およびis in
演算子は、範囲とともに使用すると、範囲をリストとして扱います。この場合、範囲が値を含むのは、その値が範囲によって生成される個別の値の1つである場合だけです。
この点で、is in
とis within
演算子はかなり異なる振る舞いをします:
set range to 10..20
put range contains 13 -- Puts "true"
put range contains 13.5 -- Puts "false"
put 13.5 is within range -- Puts "true" (13.5 is between 10 and 20)
put 13.5 is in range -- Puts "false "(it's not one of the values 10,11,12,13,14,15,16,17,18,19, or 20)
日付/時間の範囲
日付または時間の範囲は数値範囲と同様に動作します。始点と終点の値は、それが時間範囲として認識されるためには、日付または時間の値として有効でなければなりません:
例:
set Q1 to "Jan 1" to "Mar 31"
put "Feb 3" is in Q1 -- Puts "true"
時間範囲がステップ増分を明示的に与えずに作成された場合、ステップ値は始点と終点の値により、1日、1分、または1秒とされます:
- 始点と終点の値が1日以上離れている場合、ステップ値は1日とされます。
- それらが互いに24時間以内であるが、1分以上離れている場合、ステップ値は1分とされます。
- 範囲が60秒以下である場合、ステップ値は1秒とされます。
日付/時間の範囲を自然に読みやすくするために、ステップ値を"1 day"または"1 minute"の代わりに"days"や"minutes"のような複数形の時間単位として指定します:
例:
set MondaysIn2009 to "2009-01-05" to "2009-12-31" by weeks
日付/時間の範囲がリストとしてアクセスされると、生成される各値は始点の値と同じ形式の日付/時間値となります。
例:
put item 33 of "Jan 1" to "March 31" -- Puts "Feb 2"
put item 33 of "January 1" to "Mar 31" -- Puts "February 2"
文字の範囲
範囲は、Unicode文字の範囲を指定することもできます。文字範囲の一般的な使用例の1つは、アルファベットを指定することです:
例:
set alphabet to "a".."z"
set upperAndLowerLetters to "A".."Z" &&& "a".."z"
put "z" to "t" as list -- Puts ["z","y","x","w","v","u","t"]
範囲をチャンクインデックスとして使用する
範囲は、特定の文字、単語、項目、または値の他の部分を選択するために使用できます:
例:
put chars 1..5 of "abcdefgh" -- Puts "abcde"
put chars 1..5 by 2 of "abcdefgh" -- Puts "ace"
put items 2..6 by 2 of "a,b,c,d,e,f,g,h" -- Puts "b,d,f"
put items 2..6 by 2 of [a,b,c,d,e,f,g,h] -- Puts [b,d,f]
put chars 8..1 of "abcdefgh" -- Puts "hgfedcba"
put chars 8..1 as list of "abcdefgh" -- Puts [h,g,f,e,d,c,b,a]