REBOL-Core User Manual Chap6/ja

From DocBase

Jump to: navigation, search

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と呼ばれる。この位置は、ブロックの最後のワードの直後だ。 このブロックの絵を書けば、次の様になる:

rebolcore-11.gif

tailはブロックの最後を過ぎた所にあることに注意しよう。このことの重要さはすぐに明かになる。

変数colorsは、このブロックを参照するために使われる。 現時点では、ブロックのheadにセットされている:

rebolcore-12.gif

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変数は、今は新しい位置にセットされている:

rebolcore-13.gif

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

ブロックの絵はこんな感じになっている:

rebolcore-14.gif

colors変数は、いまやブロックの最後の色を指している。しかし、まだtailの位置ではない。

print tail? colors
false

tailに到達するには、さらにもう一回位置を移動させてやらなければならない:

colors: next colors

ここで、colors変数はブロックのtailに到達した。 もはや妥当な色を指してはいない。ブロックの最後を通りすぎたのだ。

rebolcore-15.gif

あなたのコードを試してみると、こんな結果が帰ってくる:

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つだけ移動させられる:

rebolcore-16.gif

これで、以前と同じコードが以前と同じように動作する:

print index? colors
3
print first colors
blue

1.2 Skipping Around

先のいくつかの例では、シリーズ中の1つの要素を一回に一つずつ移動していた。 しかし、一度に複数の要素を移動したいときには、skip関数を使う。colors変数の内容のシリーズのheadに位置しているとしよう:

rebolcore-17.gif

次のようにすることで、前方向に2つの要素をスキップできる:

colors: skip colors 2

skip関数は、next関数と同様に、シリーズ内での新しい位置を返す。

rebolcore-18.gif

次のコードで新しい位置を確認できる:

print index? colors
3
print first colors
blue

逆方向に移動するには、skipに負の値を与えればいい:

colors: skip colors -1

これはbackと似ている。 上の例では、-1個をスキップすることで要素を一つ逆方向に移動している。

rebolcore-19.gif

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

これまでに見た例の中で、firstsecondといった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]

一般的に、これは次のような感じに見える:

rebolcore-20.gif

シリーズの中の特定の箇所のサブシリーズをコピーするには、まず最初に開始点となる位置を探す。次の例では、コピーを実行する前にシリーズの2つめの位置をnextを使って前に移動させている:


sub-colors: copy/part next colors 2

probe sub-colors
[green blue]

図にするとこうなる:

rebolcore-21.gif

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]

次のように図示できる:

rebolcore-22.gif

新しい値をブロックの先頭に挿入するためには、colors変数の位置は次のようになっている〔※colors変数はここに書かれる?〕:

insert colors 'blue

redとgreenというワードは後ろにずらされ、buleワード(これはティック(')が全治されている。なぜなら、それはワードであって評価されるべきではないからだ)は、リストの先頭に挿入されている。

rebolcore-23.gif

ただし、colors変数におけるリストのheadの位置は保持されたままであることに注意しよう。

probe colors
[blue red green]

また、insert関数の返り値は使われない。 なぜなら、変数にセットされたり、ほかの関数に渡されないからだ。 もしも返り値を使わなければならない場合には、次の行のようにcolors変数の値をセットしなければならない:

colors: insert colors 'blue

ブロックに対する効果も同様だ。ただし、colors変数における位置は返り値を設定した結果によって変わるだろう。 insertからの返り値の位置は挿入された位置の直後になる。

rebolcore-24.gif

挿入はシリーズのどこにでもできる。 挿入する箇所は指定できるし、tailも含む。 tailへの挿入はシリーズへのアペンドの効果を持っている。

colors: tail colors

insert colors 'gold

probe colors
[blue red green gold]

挿入前ではこうだった:

rebolcore-25.gif

それが挿入後にはこうなる:

rebolcore-26.gif

goldというワードがシリーズの最後に挿入されている。

シリーズのtailに挿入を行なう別の方法は、append関数を使うことである。append関数はinsertと同様に機能する。ただし、常にtailに対して挿入を行なう。 上の例はこのようにも書ける:

append colors 'gold

結果は上の例と同じだ。

insertappend関数は挿入するものとしてブロックも受け付ける。例えば:

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]

insertappend関数はほかにも機能を持っているが、詳細は後のセクションで述べる。

1.6 Removing Values (値の削除)

remove関数を使うことで、seriesの中から任意の1津以上の値を削除することが可能だ。

例えば、まずは次のようなブロックからはじめよう:

colors: [red green blue gold]

これは次のようになる:

rebolcore-27.gif

次のように書けば、ブロックから最初の値を取り除くことができる:

remove colors

この時点でのブロックは次のようになる:

rebolcore-28.gif

次のように表示させることも可能だ:

probe colors
[green blue gold]

remove関数は、colors変数内の相対的な位置によって値を削除することもできる。series内のどこからでも、位置を指定することで値を削除できる。

remove next colors

このときのブロックはこうなる:

rebolcore-29.gif

複数の値を削除する場合には、/partリファインメントを使う。

remove/part colors 2

これは残っている値を取り除き、空のブロックを返す:

rebolcore-30.gif

insert/partと同様に、remove/partの引数はブロックの範囲内に収まっていなければならない。

残っている値のすべての削除するというのは一般的に行なわれる操作だ。 clear関数はこの操作を良い直接的に行なう。 clearは、現在の位置からtailまでのすべての値を削除する。 例えば:

Colors: [blue red green gold]

これはこうなっている:

rebolcore-31.gif

次のようにすれば、blueの後をすべて削除することができる:

clear next colors

ここでブロックはこうなっている:

rebolcore-32.gif

ブロック全体をクリアするのは、次のように簡単にできる:

clear colors

1.7 Changing Values

更に追加する関数群はseries内の値を変更するものだ。 change関数は、1つ以上の値を新しい値に置き換える。 その処理自体は値の削除と挿入でも実現可能だが、changeを使ったほうが効率的だ。

ブロックを次のように定義したとしよう:

colors: [blue red green gold]

rebolcore-33.gif

2つめの値を次のように返ることができる:

change next colors 'yellow

そして、結果はこうなる:

rebolcore-34.gif

ブロックは現在こうなっている:

probe colors
[blue yellow green gold]

poke関数は、color変数に対して相対的な特定の位置に対して変更を行なうことが可能だ。 poke関数は、前述したpick関数に似ている。

poke colors 3 'red

この結果ブロックは次のようになる:

rebolcore-35.gif

これは次のようにも確認できる

probe colors
[blue yellow red gold]

change関数は付加的なリファイン面とを持っているが、それらについてはこの章で後述する。

Personal tools