REBOL

歴史

1997年にリリースされたREBOLは、カール・サセンラスが20年に渡って設計したものである。サセンラスは AmigaOS の主要アーキテクトであり、REBOLの設計にあたっては、表示的意味論の知識に基づいて、LISP、Forth、LOGO、Self といったプログラミング言語の概念を利用した。
REBOO/Command は2000年9月にリリースされ、暗号化機能、ODBCアクセスなどが追加されている。REBOL/View は2001年4月にリリースされ、グラフィックス機能が追加されている。2001年8月にリリースされた REBOL/IOS は、拡張可能な共同作業環境である。2002年12月には、ソフトウェア開発キットがリリースされた。
2012年9月、R3（REBOL 3）オープンソースとして公開されることが発表される。2012年12月には、安定版がリリースされた。ライセンスはApache License 2.0。

プログラミング

REBOL はインタプリタ型高級言語であり、マルチプラットフォームでマルチパラダイムであり、動的リフレクションをサポートした言語である。同図像性（Homoiconicity）があり、コードとデータが同じ形式で表現され、メタプログラミングに最適である。
構造化プログラミング、関数型プログラミング、プロトタイプベースプログラミングをサポートしている。REBOLは純粋関数型言語ではなく、副作用のある命令型プログラミングの要素もある。また、純粋オブジェクト指向言語でもなく、オブジェクトでないデータ型も持っていて、他のプログラミングパラダイムもサポートしている。REBOLは特に言語指向プログラミングに適しており、さらに言えばダイアレクティング（方言派生）に適している。
REBOLは動的プログラミング言語であり、動的型付け（値は強い型付けだが、変数はそうではない）である。メモリ管理にはガベージコレクションを使い、例外処理と動的名前解決をサポートしている。

実装

REBOLインタプリタにはいくつかのエディションがある（/Core、/View、/Command、/Base、/Face、/Pro）。本稿執筆時点では、/Core が /Base 以外の他のエディションのサブセットになっていて、43 のプラットフォームで利用可能になっている。
REBOLインタプリタのソースコードは非公開である。REBOL/Core と REBOL/View で開発したアプリケーションは有償配布しても課金されない。REBOL/Pro などの拡張エディションではライセンス料の支払いが必要である。これにはODBCアクセス、ダイナミックリンクライブラリの利用、スタンドアロンのEXEファイル生成といった機能がある。
ランタイム環境は、現状では単一の実行ファイルとなっている。REBOL/Core では約300kB、REBOL/View（GUIエディション）は約650kBである。アプリケーションのスクリプトは数キロバイトを超えることは少ないため、インタプリタ本体とスクリプトを一枚のフロッピーディスクに格納できるし、電子メールでスクリプトを送るのも容易で、インターネット上で転送して実行することもできる。
インターネット上の各種プロトコルをサポートしており、電子メールエージェント、Webアプリケーションといったインターネット・アプリケーションも容易に書ける。
REBOL/View はプラットフォーム独立なグラフィック/サウンド・アクセスを提供しており、独自のウィンドウツールキットと拡張可能なウィジェット群を持つ。これにより、分散GUIアプリケーションが容易に構築できる。REBOLのダイアレクティング・モデルにより、軽量な分散コンピューティングアプリケーションの開発もできる。
REBOLコミュニティは、"REBOL desktop" を通してリンクしている。REBOL desktop はインターネット上のREBOL関連ファイルをグラフィカルに表現したもので、REBOLインタプリタに付随してインストールされる。REBOL desktop 自体はオープンソースのREBOLアプリケーションである。

例

コンソールに Hello world と表示するだけなら、次のように打ち込めばよい。
  print "Hello World!"
クロスプラットフォームのGUI版では、次のようになる。
 REBOL [
   Title: "Hello World in a Window"
   File: %hello-view.r
   Date: 12-January-2002]view layout [
    text "Hello world!" 
    button "Quit" [quit]]
さらに、HTTP と SMTP を使った単純なインターネットアプリケーションの例を示す。
 REBOL [
   Title: "Web Page Emailer"
   File:  %sendwebpage.r
   Date:  12-January-2002
   Purpose: "Get an HTML document from the web and send it through e-mail"]send branko@collin.example read http://www.rebol.com
REBOL という単語で始まるヘッダ部は、インタプリタがスクリプトの開始を知るために必要とされる。ヘッダは単に REBOL [] でもよいのだが、一般に例にあるような説明的記述をするのがよいとされている。

構文規則

parse 関数に解釈させる規則群自体も REBOL のダイアレクトで書く。文字列として解析する場合、REBOLのデータ型の一部を規則に使用できる。ブロックとして解析する場合、全てのREBOLデータ型が使え、他にもダイアレクト構築を容易にする機能が使える。

文字列解析例

最初の例は、文字列を解析して特定の単語を探し、関連するデータの一部を変数としてコピーし、他の場所でそれを使う。この例では、文字列からコピーされた部分も文字列である。具体的に言えば、"write" または "send" で始まる命令文型の文字列を入力として、簡単な構文解析で「何を」「誰が」「どうする」のかを把握する処理が記述されている。
 strings: [    "write Graham a thank-you note"    "send Allen the new source code"]foreach string strings [    print string    ; 規則はブロックで表され、角括弧で囲まれている。    parse string [        ; 各文字列は次のいずれかの単語で始まる。COPY は         ; テキストの一部をコピーし、後でそれを使う。        copy how ["write" | "send"] (print ["How:" how])        ; ここで、次の空白までをコピーする。その後には "a" または        ; "the" が続く。ここでは括弧を使って規則が一致したときに        ; とるべき動作を定義している。        copy who to " " ["a" | "the"] (print ["Who:" who])        ; 最後に、文字列の最後までをコピーする。        copy what to end (print ["What:" what])    ]    print ""]
"parse string" ブロックの最後の行を見てみると、"copy what" は現在パーサが見ている位置（"a" または "the" の後）からのテキストをコピーすることを意味し、それを変数 "what" に代入する。また、ダイアレクトは "to end" を指定しているので、文字列の最後尾まで全てをコピーすることを意味する。従って "what" には第一の文字列なら "thank-you note"、第二の文字列なら "new source code" が代入される。
Print ["What:" what ] と打ち込むと、以下のように出力される:
What: thank-you note
What: new source code

ブロック解析例

ファイル解析ユーティリティがあり、ユーザーが操作すべきファイルを指定し、それをいつ実行し、結果をどこに送り、誰に通知するかということを簡単に指定できるようにしたいとする。ダイアレクトは、この種のタスクに対して、柔軟なテキストベースのインタフェースを提供できる。
ダイアレクトは複数のアイテムを許容し、語順が変動しても問題なく、可読性のために人間が余分な単語を追加してもプログラムの動作には影響を与えない。
ここでは、ユーザーがアプリケーションに送るコマンドセットを2種類定義している。
 command-blocks: [    [        analyze %test-1.txt %test-2.txt         post results to http://www.wikipedia.org/results.dat        notify rebol-xyz@wikipedia.org at 10:00 and again at 10:00pm    ]    [        at 10:00 and at 10:00pm analyze %test-1.txt notify         rebol-xyz@wikipedia.org and reb-guy@wikipedia.org         post to ftp://wikipedia.org/results.dat    ]]; アポストロフィが前置された単語はマッチさせたいリテラル単語列である。; 感嘆符が後置された単語はマッチさせたいデータ型である。; SOME は "one or more" を意味する。正規表現の "+" に似ている。; OPT はオプションを意味し、ゼロ個でも1個でもよい。; SET マッチした値を後で参照できるよう単語と結びつける。; ちょうど、変数への代入に相当する。foreach block command-blocks [    print mold block    parse block [        some [            ['analyze some [set file file! (print file)]]            | ['notify some [set who email! opt 'and (print who)]]            | ['at set when time! (print when)]             | ['post opt 'results 'to set target url! (print target)]            | 'again            | 'and         ] to end    ]    print ""]
この例で、file、email、time、url といったものは全てREBOLにおけるネイティブなデータ型であり、構文解析中にそれらの値を抽出して、直接 REBOL の式に適用可能である。例えば、 who の値は send 関数で電子メール送信に使われ、target の値は write 関数によるデータのポストに使われる。