REBOL-Core User Manual Chap3/ja
From DocBase
Chapter 3 - Quick Tour
REBOL/Core Users Guide Main Table of Contents Send Us Feedback
(Original: http://www.rebol.com/docs/core23/rebolcore-3.html )
(Translation ver. 0.3)
1. Overview (概要)
この章ではREBOL言語に親しむ手っ取り早い方法を提供する。例を使って、この章ではこの言語の基本的な概念と構造を紹介するとともに、データの値からネットワーク操作の実行までのすべてを紹介する。
2. Values (値)
スクリプトは、値の並びとして書かれる。さまざまな値が存在し、あなたは日常の経験からそれらに慣れ親しんでいる。
可能な場合には、REBOLは、(小数を含む)10進数や金額、時間、そして日付のインターナショナルなフォーマットを使うことができる。
2.1 Numbers (数)
数は整数や、(小数を含む)10進数、あるいは科学的記法で書き表すことができる。例えば:
1234 -432 3.1415 1.23E12
また、ヨーロッパ形式でも書くことができる:
123,4 0,01 1,2E12
〔訳注:ヨーロッパでは、小数点に","(カンマ)を、位取りに"."(ピリオド)使う国もある。REBOLで、位取りに"."が使えるかは試していません。〕
2.2 Times (時間)
時間は、時と分、そして省略可能な秒を、それぞれコロンで区切って書かれる。例えば:
12:34 20:05:32 0:25.345 0:25,345
秒は、さらに小数による10進数での1秒未満の値を含んでも構わない。時間は、AMおよびPMを、スペースを挟まずに含んでもよい:
12:35PM 9:15AM
2.3 Dates (日付)
日付は、インターナショナルな形式: 日-月-年、あるいは年-月-日のどちらで書いても構わない。日付は時刻およびタイムゾーンを含めることもできる。 月の名前や、その省略形も、米国において使いやすいように、利用可能となっている。例えば:
20-Apr-1998 20/Apr/1998 (USA friendly) 20-4-1998 1998-4-20 (international) 1980-4-20/12:32 (date with time) 1998-3-20/8:32-8:00 (with time zone)
2.4 Money (金額)
金額は、省略可能な3文字の通貨記号に、数字が続いたものとして書くことができる。例えば:
$12.34 USD$12.34 CAD$123.45 DEM$1234,56
2.5 Tuples (タプル)
タプルは、バージョン番号や、RGBの色の値や、ネットワークアドレス等を記述するのに使う。0から255までの範囲の整数が、ドットで区切られたものとして書く。例えば:
2.3.0.3.1 255.255.0 199.4.80.7
少なくとも2つのドットが必要である(そうでなければ、数はタプルではなく、(小数を含む)10進数として解釈される)。例えば:
2.3.0 ; tuple 2.3. ; tuple 2.3 ; decimal
2.6 Strings (文字列)
文字列には、1行形式と複数行形式がある。1行形式の文字列はクォートで囲まれている。複数行形式の文字列は、ブレースで囲まれている。クォートや、タブ、改行を含む文字列は、複数行形式でブレースで囲まれなければならない。例えば:
"Here is a single-line string"
{Here is a multiline string that
contains a "quoted" string.}
文字列中の特殊文字(エスケープ)はキャレット(^)で指定する。エスケープシーケンスの表については、値の章の文字列の説を参照のこと。
2.7 Tags (タグ)
タグはXMLやHTMLのようなマークアップ言語で使いやすい。タグは不等号で囲まれている。例えば:
<title> </body> <font size="2" color="blue">
2.8 Email Addresses (emailアドレス)
emailアドレスもまたREBOL中に直接書ける。1個のアットマーク(@)を含んでいなければならない。例えば:
info@rebol.com pres-bill@oval.whitehouse.gov
2.9 URLs (URL)
REBOLは、大抵の種類のインターネットURLを受理可能だ。それらはスキーム名(例えばHTTP)で始まり、パスが続く。例えば:
http://www.rebol.com ftp://ftp.rebol.com/sendmail.r ftp://freda:grid@da.site.dom/dir/files/ mailto:info@rebol.com
2.10 Filenames (ファイル名)
ファイル名は、パーセント記号から始まることで、他のワードと区別される。例えば:
%data.txt %images/photo.jpg %../scripts/*.r
2.11 Pairs (ペア)
ペアは、空間的な座標、例えばディスプレイ上の位置などを指定するのに使う。これらは、場所を指定するのにも、大きさを指定するのにも使う。座標はxで区切られる。例えば:
100x50 1024x800 -50x200
2.12 Issues (イシュー)
イシューは、電話番号やモデル番号、クレジットカード番号などの識別番号を表す。例えば:
#707-467-8000 #0000-1234-5678-9999 #MFG-932-741-A
2.13 Binary (2進数)
2進数は任意の長さのバイト文字列である。それらは直接16進数あるいはbase-64にコード化されていて構わない。例えば:
#{42652061205245424F4C}
64#{UkVCT0wgUm9ja3Mh}
3. Words (ワード)
ワードとは、REBOLで使われるシンボルのことだ。ワードは、変数であってもそうでなくても構わず、それがどのように使われるかに依存する。ワードは直接、シンボルとして使うこともできる。
show next image Install all files here Country State City Street Zipcode on off true false one none
REBOLにはキーワードは存在しない; どのようなワードが使えて、またどのように使わなければいけないかという制約は存在しない。例えば、あなた自身の関数をprintという名前で定義し、それを事前に定義されている値を表示する関数の代わりに使うことも可能だ。
ワードは、大文字小文字の区別をせず、またハイフンやその他、次に挙げるようないくつかの特殊な文字を含んでも構わない:
+ - ` * ! ~ & ? |
次の例はワードとして妥当なものだ:
number? time? date! image-files l'image ++ -- == +- ***** *new-line* left&right left|right
ワードの終わりは、スペースや、改行、あるいは以下の文字のいずれかによって示される:
[ ] ( ) { } " : ; /
以下の文字は、ワードの中に使うことは許されていない:
@ # $ % ^ ,
4. Blocks (ブロック)
REBOLは値とワードでブロックをブロックにグルーピングすることで構成される。ブロックはコードにも、リストにも、配列にも、テーブルにも、ディレクトリにも、アソシエーションにも、またそれ以外のシーケンスにも使われる。
ブロックは、シリーズの一種であり、値を特定の並び順に並べて構成されたものの集まりである。
ブロックはブレース[ ]で囲われる。ブロックの中では、値とワードを好きな並びで書くことが出来、また何行にわたってもよい。次の例はブロックの正しい形式の例だ:
[white red green blue yellow orange black]
["Spielberg" "Back to the Future" 1:56:20 MCA]
[
Ted ted@gw2.dom #213-555-1010
Bill billg@ms.dom #315-555-1234
Steve jobs@apl.dom #408-555-4321
]
[
"Elton John" 6894 0:55:68
"Celine Dion" 68861 0:61:35
"Pink Floyd" 46001 0:50:12
]
ブロックは、データを書くのと同様に、次の例に示すように、コードを書くのにも使われる:
loop 10 [print "hello"]
if time > 10:30 [send jim news]
sites: [
http://www.rebol.com [save %reb.html data]
http://www.cnn.com [print data]
ftp://www.amiga.com [send cs@org.foo data]
]
foreach [site action] sites [
data: read site
do action
]
スクリプトファイル自身もまたブロックだ。カッコが書かれてなかったとしても、ブロックとして扱われる。例えば、次のような行がスクリプトファイルにあったとしよう:
red green blue yellow
ファイルが読み込まれた時に、red, green, blue, そしてyellowを含むブロックとして扱われる。これは、次のように書くのと等価だ:
[red green blue yellow]
5. Variables (変数)
ワードは値を参照する変数としても使える。変数としてワードを定義するには、ワードにコロン(:)を続けて書き、さらに値を以下の例のように書けばいい:
age: 22 snack-time: 12:32 birthday: 20-Mar-1997 friends: ["John" "Paula" "Georgia"]
変数は、関数(関数の項を参照)やオブジェクト(オブジェクトの項を参照)を含む、どのような型の値でも参照可能だ。
変数は、ブロックや関数、あるいはプログラム全体という、定義された文脈においてのみ特定の値を参照する。それらの文脈の外では、その変数は別の値を参照するかもしれないし、値を持たないかもしれない。変数の文脈はプログラム全体にわたることも可能だし、特定のブロックや、関数、あるいはオブジェクトに制限する事も可能だ。他の言語では、変数の文脈は、変数のスコープと呼ばれることがある。
6. Evaluation (評価)
ブロックは、その結果を計算するために評価される。ブロックが評価される時には、変数はその値が用いられる。次の例では、前節で定義された変数age, snack-time, birthday, そしてfriendsが評価されている:
print age 22 if current-time > snack-time [print snack-time] 12:32 print third friends Georgia
loopを使えば、次の例のように、1つのブロックを複数回評価する事も可能だ:
loop 10 [prin "*"] ;("prin" is not a typo, see manual)
**********
loop 20 [
wait 8:00
send friend@rebol.com read http://www.cnn.com
]
repeat count 3 [print ["count:" count]]
count: 1
count: 2
count: 3
ブロックの評価は結果を返す。次の例では、5とPMが、それぞれのブロックを評価した結果として返り値となっている:
print do [2 + 3] 5 print either now/time < 12:00 ["AM"]["PM"] PM
REBOLではブロックの評価の際の演算順序に関する特別なルールは存在しない。 ブロックの値とワードは、次の例のように、常に頭から後ろへと評価される:
print 2 + 3 * 10 50
次の例のように、括弧を使って評価順序を変えることもできる:
2 + (3 * 10) 32 (length? "boat") + 2 6
あなたはブロックを評価し、その中に含まれる複数の結果を返すこともできる。これがreduce関数の用途だ:
reduce [1 + 2 3 + 4 5 + 6] 3 7 11
7. Functions (関数)
関数は、ブロックが評価される度に新しい値が与えられるような変数を持ったブロックである。それらの変数は、関数の引数と呼ばれる。
次の例では、ワードsumが、aとbの2つの引数を受け取る関数を参照するように設定される:
sum: func [a b] [a + b]
上の例では、funcが、新しい関数を定義するために使われている。関数定義の最初のブロックは関数の引数を記述している。2つめのブロックが、その関数が使われたときに評価されるコードからなるブロックだ。この例では、2つめのブロックで、2つの値を加算し、その結果を返している。
次の例は、先に定義したsum関数を使った例だ:
print sum 2 3 5
関数によっては、引数とともに局所変数が必要になるだろう。そのような種類の関数を定義するには、次の例のように、funcではなく、functionを用いる:
average: function [series] [total] [
total: 0
foreach value series [total: total + value]
total / (length? series)
]
print average [37 1 42 108]
47
上の例では、ワードseriesが引数であり、ワードtotalが、この関数の計算に使われる局所変数だ。
関数の引数のブロックには、次の例のように、関数の目的とその引数について記述した文字列を含めることもできる:
average: function [
"Return the numerical average of numbers"
series "Numbers to average"
] [total] [
total: 0
foreach value series [total: total + value]
total / (length? series)
]
この説明的文字列は関数とともに保持され、次のように、その関数についてのhelpの問い合わせの際に表示される:
help average
USAGE:
AVERAGE series
DESCRIPTION:
Return the numerical average of numbers
AVERAGE is a function value.
ARGUMENTS:
series -- Numbers to average (Type: any)
8. Paths (パス)
あなたがファイルやURLを使っていれば、すでにパスの概念には慣れていることだろう。パスは、ある場所から別の場所へナビゲートするために使われる値の集合を提供する。 ファイルの場合であれば、パスは特定のファイルが存在する場所であるディレクトリへ到達するための道順を指定する。REBOLでは、パスの中の値をリファインメント〔訳注: 細分〕と呼ぶ。
次の、ファイルパスとURLパスの例のように、スラッシュ(/)を、パスの中のワードおよび値を区切るのに使う:
%source/images/globe.jpg http://www.rebol.com/examples/simple.r
パスは、ブロックから値を選択したり、文字列から文字を取り出したり、オブジェクトの中の変数にアクセスしたり、関数の操作を指定するのにも使われる。次の例のように:
USA/CA/Ukiah/size (block selection) names/12 (string position) account/balance (object function) match/any (function option)
次の例におけるprint関数は、いくつかのブロックからなる小さなデータベースに、パスを使ってアクセスすることの簡単さを示す:
towns: [
Hopland [
phone #555-1234
web http://www.hopland.ca.gov
]
Ukiah [
phone #555-4321
web http://www.ukiah.com
email info@ukiah.com
]
]
print towns/ukiah/web
http://www.ukiah.com
9. Objects (オブジェクト)
オブジェクトは、ある文脈において特定の値を持つ変数の集合である。オブジェクトはデータ構造と、より複雑な振る舞いを管理するために使われる。次の例では、銀行口座が、自身の属性と関数を持ったオブジェクトとして定義されている:
account: make object! [ name: "James" balance: $100 ss-number: #1234-XX-4321 deposit: func [amount] [balance: balance + amount] withdraw: func [amount] [balance: balance - amount] ]
上の例では、ワードname, balance, ss-number, deposit, そしてwithdrowが、account objectの局所変数である。depositとwithdrow変数は、オブジェクト内で定義されている関数である。accountの変数には、次の例のようにパスを使ってアクセスできる:
print account/balance $100.00 account/deposit $300 print ["Balance for" account/name "is" account/balance] Balance for James is $400.00
次の例は、新しいbalanceを与えるが、他のものは変えずに、新しいaccountを作る例である:
checking-account: make account [
balance: $2000
]
新しいオブジェクトはchecking-accoutと呼ばれ、新しいbalanceの金額以外は、元々のaccountと値を共有している。
あなたは、古いaccountオブジェクトを拡張し、新しいaccoutオブジェクトを簡単に作れる。 銀行名と最後の取引日の変数を付け加える場合にはこうなる:
account: make account [
bank: "Savings Bank"
last-active: 20-Jun-2000
]
print account/balance
$400.00
print account/bank
Savings Bank
print account/last-active
20-Jun-2000
10. Scripts (スクリプト)
スクリプトは読み込まれて評価されるブロックが書かれているファイルである。 ブロックは、コードあるいはデータを含み、大体においていくつかのサブブロックを含む。
スクリプトには何のコードであるのかを示すヘッダが必要だ。ヘッダにはスクリプトタイトル、日付、その他の情報を書ける。次のスクリプトの例では、最初のブロックにヘッダ情報が書かれている:
REBOL [
Title: "Web Page Change Detector"
File: %webcheck.r
Author: "Reburu"
Date: 20-May-1999
Purpose: {
Determine if a web page has changed since it was
last checked, and if it has, send the new page
via email.
}
Category: [web email file net 2]
]
page: read http://www.rebol.com
page-sum: checksum page
if any [
not exists? %page-sum.r
page-sum <> (load %page-sum.r)
][
print ["Page Changed" now]
save %page-sum.r page-sum
send luke@rebol.com page
]
11. Files (ファイル)
REBOLにおいて、ファイルにアクセスするのは簡単だ。以下の表に、ファイルにアクセスするいくつかの方法を紹介しよう。
あなたは、テキストファイルをこのようにして読み込める:
data: read %plan.txt
あなたは、テキストファイルをこの様にして表示させられる:
print read %plan.txt
テキストファイルを書くには、こうする:
write %plan.txt data
例えば、現在の時刻を書き出すにはこうすればいい:
write %plan.txt now
ファイルの最後に追加するのも簡単にできる:
write/append %plan data
バイナリファイルはこのように読み書きできる:
data: read/binary %image.jpg write/binary %new.jpg data
REBOLブロックあるいは値としてファイルを読み込むにはこうする:
data: load %data.r
ブロックや値をファイルに保存するのも非常に簡単だ:
save %data.r data
ファイルをスクリプトとして評価するにはこうすればいい(このためにはヘッダが必要だ):
do %script.r
ファイルディレクトリを読み込むこともできる:
dir: read %images/
そして、ファイル名を表示させる事もできる:
foreach file dir [print file]
新しいディレクトリを作るにはこうする:
make-dir %newdir/
原罪のディレクトリのパスを得るにはこうすればいい:
print what-dir
ファイルを消去したければこうすればいい:
delete %oldfile.txt
ファイル名の変更もできる:
rename %old.txt %new.txt
ファイルについての情報を得るにはこうすればいい:
print size? %file.txt print modified? %file.txt print dir? %image
12. Networking (ネットワーク)
REBOLにはいくつものインターネットプロトコルが組み込まれている。それらのプロトコルは簡単に使えて、ネットワークについての知識も少ししか必要ない。
12.1 HTTP
次の例は、webページを読むためにどのようにHTTPプロトコルを使うかの例だ:
page: read http://www.rebol.com
次の例は、webページから画像を取って来て、ローカルのファイルに書き出す例だ:
image: read/binarywrite/binary %image.jpg image
12.2 FTP
次の例は、FTP(file transfer protocol)を用いて、サーバからファイルを読んだり、ファイルを書き込んだりする例だ:
file: read ftp://ftp.rebol.com/test.txt write ftp://user:pass@site.dom/test.txt file
次の例は、FTPからディレクトリのリストを得る:
print read ftp://ftp.rebol.com/pub
12.3 SMTP
次の例は、simple mail transfer protocol (SMTP)を用いてemailを送信する:
send luke@rebol.com "Use the force."
次の例は、テキストファイルをemailとして送信する:
send luke@rebol.com read %plan.txt
12.4 POP
次の例では、post office protocol (POP) を用いてemailを取り出し(ただしサーバ上には残す)、現在のメッセージをすべて表示する:
foreach message read pop://user:pass@mail.dom [
print message
]
12.5 NNTP
次の例では、network news transfer protocol (NNTP) を用いて、特定のニュースグループのすべてのニュースを読み出す:
messages: read nntp://news.server.dom/comp.lang.rebol
次の例は、すべてのニュースグループのリストを読み込み、それを表示する:
news-groups: read nntp://news.some-isp.net foreach group news-groups [print group]
12.6 Daytime
次の例は、サーバから現在の時刻を取得する:
print read daytime://everest.cclabs.missouri.edu
12.7 Whois
次の例では、whois プロトコルを用いて、誰がドメインの責任者なのかを表示する:
print read whois://rebol@rs.internic.net
12.8 Finger
次の例は、fingerプロトコルを用いてユーザ情報を取得する:
print read finger://username@host.dom
12.9 DNS
次の例は、ドメイン名からインターネットアドレスを求めたり、あるいはアドレスからドメイン名を求めている:
print read dns://www.rebol.com print read dns://207.69.132.8
12.10 TCP
REBOLでは、TCP/IPを用いた直接の接続も可能だ。次の例は簡単だが便利だ。サーバはあるポートで接続を待ち、何かが送られてきたら実行する:
server-port: open/lines tcp://:9999
forever [
connection-port: first server-port
until [
wait connection-port
error? try [do first connection-port]
]
close connection-port
]
Updated 3-Oct-2006 - Copyright REBOL Technologies - Formatted with MakeDoc2
Translated 10-Apr-2009.
write/binary %image.jpg image
