REBOL-Core User Manual Chap6/ja
From DocBase
Contents |
Chapter 6 - Series
REBOL/Core Users Guide Main Table of Contents Send Us Feedback
(Original: http://www.rebol.com/docs/core23/rebolcore-6.html )
- Translation ver. 0.01: ver. 2010-Jan-16
- section 1のみ
1. Basic Concepts (基本的なコンセプト)
seriesの概念は単純であり、REBOLのあらゆるところ、そしてほとんど何にでも使われている、基本的な概念だ。 REBOLを理解するためには、あなたはseriesをどのように生成し、また操作するのかを理解しなければならない。
seriesは値の集まりが、特定の順番に並んだものである。
単純だ。例えば、次のものはすべてseriesだ:
1 2 3 4 A B C D "ABCD" 10:30 4:20 7:11
REBOLにはいくつもの種類のseriesがある。ブロック、文字列、リスト、URL、パス、email、ファイル、タグ、バイナリ、ビットセト、ポート、ハッシュ、巻号〔訳注: issueはこれでいいと思うけど。〕、そしてイメージはすべてseriesであり、いくつかのseries関数を用いて同じやり方でアクセスし、また処理することができる。
1.1 Traversing a Series
seriesは、値が並べられたものであるから、あなたはある場所から別の場所へと行ったり来たりできる。次の例では、3つの色のseriesが次の様にブロックで定義されている:
colors: [red green blue]
このブロックには、何も特別なところは無い。単なる3つのワードを含んだseriesだ。 このseriesは、red, green、そしてblueという3つの値を持っている。 そしてその値は特定の順番で並べられている: redが1つめで、greenが2つめ、blueが3つめだ。
ブロックの最初の位置は headと呼ばれている。 この位置は、ワードredで占められている。 ブロックの最後の位置は、tailと呼ばれる。この位置は、ブロックの最後のワードの直後だ。 このブロックの絵を書けば、次の様になる:
tailはブロックの最後を過ぎた所にあることに注意しよう。このことの重要さはすぐに明かになる。
変数colorsは、このブロックを参照するために使われる。 現時点では、ブロックのheadにセットされている:
print head? colors true
colors変数はブロックの最初のインデックスの位置にある。
print index? colors 1
このブロックの長さは3だ:
print length? colors 3
このブロックの最初のアイテムは:
print first colors red
このブロックの2つめのアイテムは:
print second colors green
あなたは、colors変数の指す位置を、いろいろな関数を使ってブロック内で変更できる。 colors変数が指す位置を次の位置にしたければ、next関数を使う:
colors: next colors
next関数は、ブロック内の値を1つ進め、その位置を結果として返す。 colors変数は、今は新しい位置にセットされている:
colors変数の位置が変わっている。もはや、ブロックのheadを指してはいない:
print head? colors false
ブロックの2番めの位置を指している:
print index? colors 2
2番めの位置を指しているが、colorsの最初のアイテムを得ようとするとこうなる:
print first colors green
first関数によって買えされる値の位置は、ブロックの中でcolorsが指している位置に対して相対的な位置だ。 返り値はブロックの最初の色というわけではなく、ブロックの中での現在の位置に続く最初の色だ。
同様に、長さを尋ねたり、2つめの色を尋ねた場合、やはり相対的なものが帰ってくることが分かる:
print length? Colors 2 print second colors blue
さらに隣の位置に移動して、同様のことを試してみよう:
colors: next colors print index? colors 3 print first colors blue print length? colors 1
ブロックの絵はこんな感じになっている:
colors変数は、いまやブロックの最後の色を指している。しかし、まだtailの位置ではない。
print tail? colors false
tailに到達するには、さらにもう一回位置を移動させてやらなければならない:
colors: next colors
ここで、colors変数はブロックのtailに到達した。 もはや妥当な色を指してはいない。ブロックの最後を通りすぎたのだ。
あなたのコードを試してみると、こんな結果が帰ってくる:
print tail? colors true print index? colors 4 print length? Colors 0 print first colors ** Script Error: Out of range or past end. ** Where: print first colors
この最後の場合には、あなたはブロックの最後を通りすぎてしまっているため、validな最初の要素が存在しないためにエラーが帰ってきている。
もちろん、ブロックの中を逆方向に移動することもできる。次の様に書けば良い:
colors: back colors
あなたは、colors変数が指す位置を、seriesの中を逆方向に1つだけ移動させられる:
これで、以前と同じコードが以前と同じように動作する:
print index? colors 3 print first colors blue
1.2 Skipping Around
先のいくつかの例では、シリーズ中の1つの要素を一回に一つずつ移動していた。 しかし、一度に複数の要素を移動したいときには、skip関数を使う。colors変数の内容のシリーズのheadに位置しているとしよう:
次のようにすることで、前方向に2つの要素をスキップできる:
colors: skip colors 2
skip関数は、next関数と同様に、シリーズ内での新しい位置を返す。
次のコードで新しい位置を確認できる:
print index? colors 3 print first colors blue
逆方向に移動するには、skipに負の値を与えればいい:
colors: skip colors -1
これはbackと似ている。 上の例では、-1個をスキップすることで要素を一つ逆方向に移動している。
print first colors green
ただし、シリーズのtailやheadを飛び越えることは出来ないことに気をつけよう。 そうなるようなことを実行しようとした場合、skipは可能な範囲でのみ移動する。エラーは発生しない。
もしも、ずっと先の方へスキップ使用とした場合、skipはシリーズのtailを返す:
colors: skip colors 20 print tail? colors true
あるいはずっと後ろの方へスキップ使用とした場合、skipはシリーズのheadを返す:
colors: skip colors -100 print head? colors true
シリーズのheadに直接スキップしたい場合には、head関数を使おう:
colors: head colors print head? colors true print first colors red
また、tail関数を使うことで、tailを返り値として得ることが出来る:
colors: tail colors print tail? colors true
1.3 Extracting Values
これまでに見た例の中で、firstやsecondといったordinal関数を用いて、シリーズ内の特定の値を取り出していた。 ordinal関数を全部挙げると、次のとおりだ:
first second third fourth fifth last
ordinal関数は便利だし、シリーズ内でよく使われる位置から値を取り出すのに使われる。 いくつか例を挙げよう:
colors: [red green blue gold indigo teal] print first colors red print third colors blue print fifth colors indigo print last colors teal
数で位置を指定して取り出すには、pick関数を使う:
print pick colors 3 blue print pick colors 5 indigo
pickの略記法としては、パスを使う:
print colors/3 blue print colors/5 indigo
すでに見たように、シリーズからの値の取り出しは相対的に動作することを思い出そう。 colors変数において、シリーズ内の位置が異なっていれば、結果も異なる。
シリーズの終わりを越えて値を取り出そうとした場合、ordinal関数を使ったのならエラーが発生し、pick関数やpickパスの場合にはnoneが返る:
print pick colors 10 none print colors/10 none
1.4 Extracting a Sub-series (サブシリーズの抽出)
copy関数を使うことで、シリーズから複数の値を抜き出すことができる。そのためには、copyに/partリファインメントを使う。これはあなたが抜き出したい値の数を指定する:
colors: [red green blue] sub-colors: copy/part colors 2 probe sub-colors [red green]
一般的に、これは次のような感じに見える:
シリーズの中の特定の箇所のサブシリーズをコピーするには、まず最初に開始点となる位置を探す。次の例では、コピーを実行する前にシリーズの2つめの位置をnextを使って前に移動させている:
sub-colors: copy/part next colors 2 probe sub-colors [green blue]
図にするとこうなる:
The length of the series to copy can be specified as an ending position, as well as a copy count. Note that the position indicates where the copy should stop, not the ending position.
コピーするシリーズの長さは修了位置によって指定する。コピーのカウントと同じだ。 コピーが停止すべき場所を指定する位置は最後の位置ではない〔※次の例を参照。何番目でコピーすると指定していても、実際にコピーされるのはその1つ前まで。たぶんそのことを言っている。。〕。
probe copy/part colors next colors [red] probe copy/part colors back tail colors [red green] probe copy/part next colors back tail colors [green]
これは、find関数の結果として修了位置を見つける場合には便利だ:
file: %image.jpg print copy/part file find file "." image
1.5 Inserting and Appending (挿入と追加)
insert関数を使うことで、シリーズ中の好きな箇所に1つ以上の値を挿入することができる。シリーズ内のある箇所に値を挿入する場合には、スペースがそれ以前の値とそれ以後の値をずらすのに使われる。
例えば、このブロックの場合:
colors: [red green]
次のように図示できる:
新しい値をブロックの先頭に挿入するためには、colors変数の位置は次のようになっている〔※colors変数はここに書かれる?〕:
insert colors 'blue
redとgreenというワードは後ろにずらされ、buleワード(これはティック(')が全治されている。なぜなら、それはワードであって評価されるべきではないからだ)は、リストの先頭に挿入されている。
ただし、colors変数におけるリストのheadの位置は保持されたままであることに注意しよう。
probe colors [blue red green]
また、insert関数の返り値は使われない。 なぜなら、変数にセットされたり、ほかの関数に渡されないからだ。 もしも返り値を使わなければならない場合には、次の行のようにcolors変数の値をセットしなければならない:
colors: insert colors 'blue
ブロックに対する効果も同様だ。ただし、colors変数における位置は返り値を設定した結果によって変わるだろう。 insertからの返り値の位置は挿入された位置の直後になる。
挿入はシリーズのどこにでもできる。 挿入する箇所は指定できるし、tailも含む。 tailへの挿入はシリーズへのアペンドの効果を持っている。
colors: tail colors insert colors 'gold probe colors [blue red green gold]
挿入前ではこうだった:
それが挿入後にはこうなる:
goldというワードがシリーズの最後に挿入されている。
シリーズのtailに挿入を行なう別の方法は、append関数を使うことである。append関数はinsertと同様に機能する。ただし、常にtailに対して挿入を行なう。 上の例はこのようにも書ける:
append colors 'gold
結果は上の例と同じだ。
insertとappend関数は挿入するものとしてブロックも受け付ける。例えば:
colors: [red green] insert colors [blue yellow orange] probe colors [blue yellow orange red green]
新しい値をredとgreenの間に入れたければこうすればいい:
colors: [red green] insert next colors [blue yellow orange] probe colors [red blue yellow orange green]
insertとappend関数はほかにも機能を持っているが、詳細は後のセクションで述べる。
1.6 Removing Values (値の削除)
remove関数を使うことで、seriesの中から任意の1津以上の値を削除することが可能だ。
例えば、まずは次のようなブロックからはじめよう:
colors: [red green blue gold]
これは次のようになる:
次のように書けば、ブロックから最初の値を取り除くことができる:
remove colors
この時点でのブロックは次のようになる:
次のように表示させることも可能だ:
probe colors [green blue gold]
remove関数は、colors変数内の相対的な位置によって値を削除することもできる。series内のどこからでも、位置を指定することで値を削除できる。
remove next colors
このときのブロックはこうなる:
複数の値を削除する場合には、/partリファインメントを使う。
remove/part colors 2
これは残っている値を取り除き、空のブロックを返す:
insert/partと同様に、remove/partの引数はブロックの範囲内に収まっていなければならない。
残っている値のすべての削除するというのは一般的に行なわれる操作だ。 clear関数はこの操作を良い直接的に行なう。 clearは、現在の位置からtailまでのすべての値を削除する。 例えば:
Colors: [blue red green gold]
これはこうなっている:
次のようにすれば、blueの後をすべて削除することができる:
clear next colors
ここでブロックはこうなっている:
ブロック全体をクリアするのは、次のように簡単にできる:
clear colors
1.7 Changing Values
更に追加する関数群はseries内の値を変更するものだ。 change関数は、1つ以上の値を新しい値に置き換える。 その処理自体は値の削除と挿入でも実現可能だが、changeを使ったほうが効率的だ。
ブロックを次のように定義したとしよう:
colors: [blue red green gold]
2つめの値を次のように返ることができる:
change next colors 'yellow
そして、結果はこうなる:
ブロックは現在こうなっている:
probe colors [blue yellow green gold]
poke関数は、color変数に対して相対的な特定の位置に対して変更を行なうことが可能だ。 poke関数は、前述したpick関数に似ている。
poke colors 3 'red
この結果ブロックは次のようになる:
これは次のようにも確認できる
probe colors [blue yellow red gold]
change関数は付加的なリファイン面とを持っているが、それらについてはこの章で後述する。
