PreRebol30ManualGuideWritingCodeCodeWordsAndVariables/ja

From DocBase

Jump to: navigation, search

Contents

REBOL 3 Guide: Code: Words and variables


Understanding words is the key to REBOL.

Contents

  • Meaning of words
  • Special notations for words
  • Words as symbols
  • Words as variables
  • Words for refinements
  • Context provides meaning
  • Usage changes the meaning

Meaning of words (ワードの意味)

ワードは、コードにもデータにも共通して使われる。

コードの中では、ワードは値(関数を含む)を保持する変数となり、また単なるシンボルにもなりうる。

例えば、次の例ではjoinというワードを3つの異なった使い方で使っている:

join a b
actions: [split join copy]
get 'join

最初の例では、joinは関数を値として持つ変数だ。しかし2つめのと3つめではシンボルとして使われている。

基本的に、ワードの意味は次のように決まる:

シンボル
その名前それ自身。であるから、joinは明らかにajoinとは異なる。別の名前だ。
記法
ワードの特別な書き方。'joinはシンボルであり、関数を値として持つ変数ではない。
文脈
どのようにワードが値に関連付けられているか。ワードは大域的あるいは局所的な意味を持ちうる。または、モジュールやオブジェクトのような別の文脈の一部になりうる。
使い方
ワードがコードの中で使われているか、データの中で使われているか。上の例では、actionブロック中に書かれているワードjoinはシンボルである。後に、それはjoin関数を得るために使われるかもしれないが、この行からだけでは判断できず、またこの行ではそれは問題ではない。

それぞれについて、以下で説明しよう。

Special notations for words (ワードの特別な記法)

ワードにはいくつかの書き方がある。特別な記法も使える。

ここでそれらを紹介しよう。このドキュメントを通して,例の中でこれらを理解することができるようになる。

基本的には、これらの記法は、ワードの動作や意味を修正する。

Notation Definition Notes
word ワードの値を普通に取得する。 値が関数であれば、それを評価し、そうでなければその値を返す。
word: ワードに値を設定する。 私たちは割り当てに=を使わない!
:word ワードの値を取得する。ただし評価はしない。 関数の値を取得するのに便利だ。
'word ワードをシンボルとして扱う。 それその物として扱い、評価は行なわない。
/word ワードをリファインメントシンボルとして用いる。 関数やオブジェクト、ファイルパス、スペシャルフィールドで用いる。

大体の場合、あなたは、普通の記法とワードに値を設定する、上の2つを使うことが多いだろう。 しかし、その他の記法も役立つし、あなたはそれらを知っておく必要がある。

Words as symbols (シンボルとしてのワード)

REBOLは記号的な言語だ。 あなたはワードをそれ自身のシンボルとして考える必要がある。単なる変数や、キーワードや、コマンドや、関数としてではなく。

上で、私たちは次のような行を示した:

actions: [split join copy]

このブロックは評価されないので、split, join, そしてcopyというワードはシンボルである。

私たちは、これを次のようなコードに書くことも出来る:

action: 'join
...
if find actions action [do something]

シンボルとしてのワードということについては、REBOLにおいてdialect(特定用途向け言語)の作成のために広く使われているので、もっといろいろと説明しなければならないことがある。

Words as variables (変数としてのシンボル)

変数は、あるオブジェクト、あるモジュール、あるいはある関数など、特定の文脈において値に関連付けられたワードだ。

変数に値を設定するには、この記法を使う:

size: 12

すると、変数の値を得るために次のような行を書くことが出来る:

print size
12

変数については他にもいろいろと説明する必要がある事柄があるが、それらについてはこのガイドの中で紹介していこう(code: defining functions, data: objects provide context)。

"なぜコロンなのか?"

私達は、変数の設定に等号(=)ではなく、コロンを用いている。 なぜなら、その方が言語を理解するのにも、変数の定義を操作するのにも便利だからだ。 この点は、この言語にとってとても重要なことであり、あなたが学んでいくにつれ、その理由は明らかになるだろう。

Words for refinements (リファインメントのためのワード)

ワードはリファインメントにも使われる。

refinement!は、バリエーションや、オプションや明確化などを指定する。 そして、関数や、オブジェクト、インデキシング、ファイルパス、そしてその他のデータタイプに適用する抽象化である〔訳注:すみません、いまいち意味が取れません。〕

例えば、copy関数は、通常与えられた入力すべてをコピーする:

print copy "example string"

しかし、/partリファインメントが与えられると、部分的なコピーがなされる:

print copy/part "example string" 7

このように、私達は部分的なコピーに対する別の関数は不要になる。 私達は、いくつかのリファインメントを持った、単一のcopy関数だけで用が足りる。 これで、覚えることが簡単になる。

オブジェクトに対するリファインメントの例も同様だ。 それらはオブジェクトのフィールドの選択を行なうのに使われる。 あなたはこのような例をこれからたくさん見るだろう:

print system/options/home
%/users/carl

この例では、systemオブジェクトのoptionsオブジェクトの中のhomeフィールドを見ている。


なぜ、ドットではなくスラッシュなのか?

REBOLでは、私達は次のように書き:

system/options/home

次のようには書かない:

system.options.home

私達は、これはデザイン上の難しい判断であることを認める。 その判断は軽々しく出来ない。

見た目の上では、スラッシュ(/)がリファインメントに使われている。 なぜなら、それがファイルディレクトリパスに似ているからだ。

file-dir: %user/data
names: load file-dir/names.r

同様に、スラッシュリファインメントは、次の例に見るように、他の言語におけるドット(セレクター)よりもいろいろな働きをする:

load/header/only system/options/home/database.r

ここでは、loadがリファインされており、オブジェクトパスはアクセスされるパスおよびファイル名の追加がされている。

あなたが見たように、私達はドットを使わない。なぜなら、(ドットを使った拡張子付きの)ファイル名をリファインメントとして指定する機能を失いたくないからだ。

もちろん、これは、あなたが、REBOLにおいて、すべてのワードと値は(半角)スペースで区切られなければならないことを思い出す良い機会だ。

なので、divide(除算)は、こう書かなければならない:

m: n / 2

次のように書いてはいけない:

m: n/2

こう書くと、n(nがseriesだとして)に対するインデキシングリファインメントの意味になってしまう。

Context provides meaning (文脈が意味を与える)

ワードが意味を持つためには、その文脈が明らかでなければならない。

文脈はワードの意味を決める:

  • あなたに関して言えば、つまり、人間による解釈として。
  • REBOLに関して言えば、関数やオブジェクトなどのコードのセクション内における定義によって解釈される。
  • dialectに関して言えば、REBOLで書かれたほかのコードによって解釈される。

この3つの例を、明らかにしておこう。

まず最初にこの例を見よう:

sizes: [large medium small]
print sizes
large medium small

large, medium, smallというワードは単なるシンボルだ。 このように定義されると、それらは変数ではないし、REBOLにとっては意味が無い。 ただ、あなた、つまり読み手にとってのみ意味がある。

2番目に、次の例を見てみよう:

large:  1000
medium: 100
small:  10
print [large medium small]
1000 100 10

ここでは、print関数がREBOLによって評価されるときに既知のスコープ内において、それらのワードは特定の値を持つものとして定義されている。

3つめの例を見てみよう:

rules: ['data 'is ['large | 'medium | 'small]]
parse [data is medium] rules
true

parse [data is huge] rules
false

最初の例のように、large, medium, smallというワードはシンボルだが、それらの意味はparseに与えられるrulesによって定義されている。 それらの意味はそれらのruleに関連している。 それらは言語のdialectを定義している(まぁ大したことのないものだが)。

Usage changes the meaning (使い方が意味を変える)

ワードの意味は、それらがどのように使われるのかにもよって違ってくる。 同士と名詞のように、ある時には、動詞は名詞となりうるし、逆もまた成り立つ。

例えば、次の例では、どの行でもprintというワードを用いているが、各々の行におけるその意味は異なっている。

print 123
probe [print]
source print
do get second [probe print] 456
parse [time to print 10:30] [thru 'print set time time!]
database/print data

それぞれのprintは、異なった使われ方をしている。

Translated 12-May-2009

Personal tools