slap リファレンスマニュアル

home > リファレンスマニュアル

目次

はじめに

slapはエイプリルフール用のネタとして作成された言語です。 突貫作業で作成されたので、本来あって当然の機能も実装されていません。 そんなわけで、あんまりマジになられてもこまるのですが、とりあえず某言語真似をすると、以下のような感じの言語です。

インタプリタ
単に構文木を辿るだけのインタプリタです。 高速化などの仕組みはいっさいありません。 なお、実行時にコマンドラインオプションとして-Vを指定すると、バイトコードを生成して組み込み仮想マシンを用いた実行が行われますが、この場合、メモリ消費が増える上にオーバーヘッドによって動作が遅くなります。
動的型付け
変数には型がありません。
変数の宣言が必要
へんすうをせんげんなしでつかうなんてとんでもない!
単純な文法
というか、このリストの元ネタの某言語が「単純な文法」を自称するのは詐欺だと思います。
ユーザによるメモリ管理が不要
不要というか、できません。 いちおう処理系が管理をしようとしてくれてはいるのですが、いい加減なものなので、あまりあてにはならないでしょう。
全てがオブジェクト
整数とか本当にオブジェクトなのかどうか疑惑もありますが、まあいちおうそうです。
クラス、継承、メソッド
まあ、一応はそれなりに備えてはいます。
特異メソッド
これがあればプロトタイプベースのオブジェクト指向プログラミングが可能になるらしいです。 ……というか、slapは実はプロトタイプベースっぽい仕組みで作られているので、とうぜんあります。
単一継承と実装共有
継承は単一継承しかできませんが、代わりに実装共有の機能が……あ、考えるの忘れてました。ありません。
ブロック付きメソッド呼び出し
元ネタの某言語と同様に、こういう機能があります。 しかも、元ネタと異なり、複数のブロックをメソッド呼び出しにくっつけることもできます。使い道はほとんどないですが。
クロージャ
と呼んでいいのかどうかはわかりませんが、むしろオブジェクト化されていない手続きはありません。
貧弱な文字列操作/正規表現
正規表現エンジンはOnigmoなので超強力ですが、slapのスクリプトレベルに見えるのは単なる正規表現マッチのみという貧弱さです。 文字列操作についても、結合ができる以外は特に何もできません。
多倍長整数
いちおうあります。でも、たまに間違った値を返すような気がします。
例外処理機構
あります!
OSへの直接アクセス
そんな機能はありません。slapで実用的なスクリプトを書くのは現状不可能です。
ダイナミックローディング
そのうちできるようになるんじゃないでしょうか。

実際のところは、slapは以下の諸項目を目標に設計・実装されました。

それ以外は割とどうでもよかったので、どうでもよさそうな設計・実装になっています。

言語仕様 - オブジェクト

オブジェクト

slapで扱える全ての値はオブジェクトです。 オブジェクトは何らかのクラスに所属します。 一般に、あるオブジェクトはそれに結び付けられた複数の別のオブジェクトへの参照を持ち、これをインスタンス変数と呼びます。 ある種のオブジェクトは「実行」することができますが、このようなオブジェクトはメソッドと呼ばれます。

オブジェクトの生成は、一般には、別のオブジェクトのメソッドを実行することによって行われます。

クラス

クラスはオブジェクトを生成するための雛形を保持するオブジェクトです。 この雛形を「プロトタイプ」と呼びます。 あるクラスが持つプロトタイプを使ってオブジェクトが生成されたとき、生成されたオブジェクトをそのクラスのインスタンスと呼び、また、そのインスタンスは元のクラスに所属していると言います。

クラスはある例外を除いて、必ず一つの「基底クラス」を持ちます。あるクラスのプロトタイプは、特に変更しない限り、基底クラスのプロトタイプと同じ機能を持ちます。これを「継承」と呼びます。 この関係を基底クラス側から見たとき、自分を継承しているクラスのことを「派生クラス」と呼びます。 継承は何段も積み重ねることができますが、基底クラスの基底クラスも基底クラスと呼び、派生クラスの派生クラスも派生クラスと呼びます。 基底クラスを持たない唯一のクラスはObjectクラスです。Objectクラスは他の全てのクラスにとって基底クラスとなります。

メソッド

オブジェクトはその所属する型などによって決定されるそれぞれ異なる機能を持ちますが、その中でも特に「実行」することができるという機能を持つオブジェクトが存在します。これをメソッドと呼びます。 あるメソッドを実行することを、通常、メソッドを呼び出す、と言います。 メソッドを呼び出す際にはそのメソッドにオブジェクトを引き渡すことができ、これを「引数」と呼びます。 なお、あるメソッドが幾つのオブジェクトを引数として受け取れるかは、そのメソッドの定義時に決定されます。

メソッドはMethodクラスかその派生クラスのインスタンスです。

言語仕様 - 文法

字句構造

slapのプログラムはASCIIキャラクタセットで与えられます。 識別子(と複数文字からなる演算子類)の途中を除いて任意の位置に空白文字をおくことができますが、ある種のリテラルの内部以外では空白文字は全て無視されます。

識別子

識別子は英文字またはアンダースコア(_)で始まり、英文字、アンダースコア、数字からなります。 長さには処理に必要になるメモリ量以外の制限はありません。

コメント

スクリプティング言語の慣例に従い、リテラル類の途中に現れるものを除き、#から改行文字までをコメントとして扱います。 また、C言語と同じように、/*から*/までもコメントとして扱います。こちらは途中に改行文字を含めることができるので、複数行にわたるコメントを書くことができます。 なお、/**/形式のコメントを入れ子にすることはできません。

予約語

予約語は以下のものです。 予約語を変数名などに使うことは、ほぼできません。 特定のケースで使えることもありますが、混乱とバグの元なので、避けた方がいいでしょう。

__FILE__    catch       finally     next        super       unless
__LINE__    class       get         null        this        until
BEGIN       def         if          override    throw       using
END         do          impl        return      trait       var
break       else        import      set         try         while
case        for         namespace   switch      undef

なお、2個以上のアンダースコアで始まる識別子は処理系によって予約されています。 現状既に予約語である__FILE____LINE__以外は現在は変数名などに使用可能ですが、将来のバージョンでは予約語と解釈されたり、処理系の正常な動作を阻害したりする可能性がありますので、使用を避けるべきです。

プログラム、文、式

プログラム

プログラムは文を並べたものです。

文は、単文、複文、制御文のいずれかです。

単文
式の後ろにセミコロン(;)を置いたものです。
複文
複数の文を中括弧({ })で囲んだものです。 なお、ここでの「複数」とは0個以上の任意の数を意味します。 複文のことをブロックと呼ぶことがあります。複文のブロックは新しいローカル変数スコープを生成しますが、特別な場合を除いて、外部のローカル変数スコープを依然として参照することができます。
制御文
詳細は後述しますが、if文やdef文などの組み込みの制御構造です。

式には様々なものがあります。 変数や定数、リテラル、演算子式、メソッド呼び出し、などです。 また、文を括弧(( ))でくくったものも式になります。

全ての式は値を持ちます。 文を括弧でくくったものについては、一般的には文中の最後に評価された式の値が採用されます。

変数と定数

変数には幾つかの種類がありますが、一部を除いてはその名前の一文字目によって判断されます。 変数名のそれ以外の部分は識別子一般のルールに従います。

ローカル変数

ローカル変数は英小文字で始まります。 ローカル変数のスコープは、そのローカル変数が宣言されたブロック、すなわち、中括弧で囲まれた範囲内となります。 ただし、範囲内に名前空間定義、クラス定義、メソッド定義がある場合、それらの中にはローカル変数のスコープは及びません。

ローカル変数はvar文によって宣言されます。 未宣言のローカル変数を参照しようとした場合、その時点におけるthisオブジェクトのインスタンス変数参照に読み替えられます(そして、それも見つからなければNameError例外が発生します)。

var foo;        # ローカル変数「foo」の宣言

var bar = 123;  # ローカル変数「bar」を宣言し、同時に値123を代入

publicインスタンス変数

publicインスタンス変数はローカル変数と同様に英小文字で始まります。 publicインスタンス変数は特定のオブジェクトに所属しており、そのオブジェクトのドット式で参照できます。 また、thisオブジェクトのpublicインスタンス変数については、単に変数名のみで参照できます。

publicインスタンス変数は、ドット式への代入、または、def文によって宣言されます。def文で宣言した場合は必然的に値はメソッドオブジェクトとなります。 ローカル変数との混同の可能性を考えると、メソッド以外のpublicインスタンス変数以外はなるべく宣言しない方が無難だと思われます。

this.baz = 456;  # thisのpublicインスタンス変数「foo」を宣言し、同時に値456を代入

$p(this.baz);    # 「456」を表示
$p(baz);         # これも「456」を表示

privateインスタンス変数

privateインスタンス変数はアンダースコア(_)で始まります。 publicインスタンス変数と同様に特定のオブジェクトに所属してはいますが、特例を除いてドット式で参照・代入することはできません。 もちろん、thisオブジェクトのprivateインスタンス変数は、単に変数名のみで参照できます。

privateインスタンス変数は、代入、または、def文によって宣言されます。

privateインスタンス変数をドット式で参照する際の特例は以下の通りです。 2つ目の意味がいまいちわかりにくいですが、要するに、slapのprivateインスタンス変数はC++などの言語のprivateよりはprotectedに似ているということです。

  1. ドットの左側の評価結果がthisオブジェクトとなる場合
  2. ドットの左側の評価結果がthisオブジェクトの所属するクラスの基底クラスのプロトタイプとなる場合
_foo = 789;  # thisのprivateインスタンス変数「_foo」を宣言し、同時に値789を代入

$p(_foo);    # 「789」を表示

グローバル変数

グローバル変数はドル記号($)で始まります。 グローバル変数は代入によって宣言され、いったん宣言されればプログラムのどの位置からも参照可能です。 あんまりユーザーが使うべきものではなく、どちらかというと処理系がユーティリティ的なメソッドを提供するための機能だと考えてください。

$foo = "a";  # グローバル変数「$foo」を宣言し、同時に値"a"を代入

$p($foo);    # 「"a"」を表示

擬似変数

既に幾つかは名前が出ていますが、擬似変数と呼ばれる特殊な変数があります。 これらは全て予約語で参照され、代入することはできません。

this
現在の実行主体であるオブジェクト
null
「空」あるいは「偽」を意味する唯一のオブジェクト
__FILE__
現在のソースファイル名。パス部分を含むとは限りません。
__LINE__
現在のソースファイル中の行番号。手抜きなので時々ずれています。

定数

定数は英大文字で始まります。 代入によって宣言され、いったん宣言されれば同じ名前空間からはそのまま、別の名前空間からは名前空間解決式を使って参照できます。 名前空間はnamespace文またはclass文によって生成されます。

なお、定数はその名前とは裏腹に一定の値を保持するわけではなく、いったん宣言された定数に別の値を代入することができます。ただし、その場合は警告が出力されます。 また、定数の値となるオブジェクトは同じでも、そのオブジェクトを操作することによって状態が変化することもありえます。 結局のところ、他の変数類とは異なったルールで参照可能な変数だと思っておいた方が無難だと思われます。

A = 1;     # 定数「A」を宣言し、同時に値1を代入
$p(A);     # 「1」

# 名前空間「X」を生成
namespace X {
}
X::A = 2;  # X内にも定数「A」を宣言し、同時に値2を代入
$p(X::A);  # 「2」
$p(A);     # 「1」  元の名前空間の「A」は変化していない

リテラル

数字や文字列のように、プログラム中に直接書いておくことができる値をリテラルと言います。

数値リテラル

2進数リテラル
0bで始まり、0または1が連続するもの。0b1001など。
8進数リテラル
0または0oで始まり、07の数字が連続するもの。0123など。
10進数リテラル
19の数字または0dで始まり、09の数字が連続するもの。345など。
16進数リテラル
0xで始まり、09の数字またはAFあるいはafの英文字が連続するもの。0xDeadBeefなど。

数値リテラルの評価結果はIntegerクラスのインスタンスです。 現在のslapでは、たぶん30bitとかでオーバーフローするので、あまり大きい数値は書けません。 また、浮動小数点数など他の型の数値も現状は取り扱っていないのでリテラルも存在しません。

文字列リテラル

ダブルクォート(")文字列リテラル
バックスラッシュ(フォントによっては円記号)(\)と一部の文字の組み合わせが特別扱いされます。"hello!\n"など。 また、後述の埋め込み式が使用できます。
シングルクォート(')文字列リテラル
バックスラッシュ(フォントによっては円記号)(\)とシングルクォートおよびバックスラッシュの組み合わせのみ特別扱いされます。'\\300'など。

ダブルクォート文字列リテラル中で特別扱いされる文字並びは以下の通りです。

\000 (000は1~3桁の8進数)
8進数表記での文字指定
\a
ベル(0x07)
\b
バックスペース(0x09)
\e
エスケープ(0x1b)
\f
改ページ(0x0c)
\n
改行(0x0a)
\r
復帰(0x0d)
\s
空白(0x20)
\x00 (00は1~2桁の16進数)
16進数表記での文字指定
その他、\と任意の文字の組み合わせ
その文字

ダブルクォート文字列には#{から}の間に任意の式を埋め込むことができます。 その式を評価した結果に対してto_sメソッドを呼び出した結果がその部分に埋め込まれます。

$p("abc#{1+2}def"); #=> "abc3def"

文字列リテラルの評価結果はStringクラスのインスタンスです。

正規表現リテラル

/で始まり/で終わること以外はダブルクォート文字列リテラルに準じます。 ただし、バックスラッシュを用いた記法は、\000 (000は1~3桁の8進数)と\x00 (00は1~2桁の16進数)しか対応しません。 埋め込み式は使用できます。

正規表現リテラルの評価結果はRegexpクラスのインスタンスです。

配列式

大括弧([ ])で囲まれ、その中に0個以上の式をカンマ(,)で区切って並べたものです。

配列式の評価結果は、各々の式を評価した結果を要素としたArrayクラスのインスタンスです。

連想配列式

アットマーク(@)付き大括弧(@[ ])で囲まれ、その中に、1個の式、または、2個の式を矢印(=>)で繋いだペア、を0個以上カンマ(,)区切って並べたものです。

連想配列式の評価結果は、1個の式のみの場合はその式の評価結果をキーかつ値としたペア、2個の式の場合は矢印の左の式の評価結果をキー、右の式の評価結果を値としたペア、を要素としたMapクラスのインスタンスです。

なお、連想配列のキーにはnull以外の任意のオブジェクトが指定可能です。 連想配列の値にはnullを含む任意のオブジェクトが指定可能です。

var map = @[:a => 1, :b, "c" => 0, 2 => null];

map.keys();   # => [:a, :b, "c", 2]
map.values(); # => [1, :b, 0, null]

シンボル

コロン(:)の後に英数字_を並べたもの、または、コロンの後に文字列リテラルを並べたものです。 シンボルとは、えーと、rubyのシンボルと同じです。

シンボルの評価結果はSymbolクラスのインスタンスです。

ブロック式

アットマーク(@)、仮引数リスト(省略可能)、複文ブロック、を順に並べたものです。 メソッドというかクロージャというかラムダというか、まあそんなような何かです。 ブロック式の評価結果はMethodクラスのインスタンスです。 ブロック式については、メソッド呼び出しおよびメソッド定義の項でもう少し詳しく説明します。

%記法

パーセント(%)の後に後述の特定の文字(リテラル指定文字)を並べることによってリテラルを生成することができます。 リテラル指定文字の後には任意の文字をデリミタとして置き、その次の文字から再びデリミタが現れるまでの間がリテラルとして扱われます。 なお、デリミタに開き括弧類(({[<)を指定した場合は、その文字ではなく、対応する閉じ括弧()}]>)がデリミタとなります。

リテラル指定文字は以下の通りです。

q
シングルクォート文字列リテラルと同じ。%q!abc!など。
Q
ダブルクォート文字列リテラルと同じ。%Q!abc!など。
r
正規表現リテラルと同じ。%r!abc!など。なお将来は挙動が変更される可能性がある。
R
正規表現リテラルと同じ。%R!abc!など。
s
シンボルとしてシングルクォート文字列リテラルを指定した場合と同じ。%s!abc!など。
S
シンボルとしてダブルクォート文字列リテラルを指定した場合と同じ。%S!abc!など。

演算子式

演算子を用いた式を演算子式と呼びます。 内部的には演算子式はメソッド呼び出しまたは制御構造に変換されますが、日常で我々が親しんでいるのに類似した記法が使えることになります。 slapには、以下の演算子があります。優先順位順に並べてあります。 特に注記がない限り、各演算子は二項演算子、つまりその前後に式を取ります。

. :: [](配列アクセス)
+(単項) -(単項) !(単項) ~(単項) ++(単項) --(単項)
**
* / %
+ -
<< >>
&
| ^
< <= > >=
<=> == != === =~ !~
&&
||
? :
= []=(配列代入)

以上のうち、!++--.::!=!~&&||? :=以外の演算子はメソッド呼び出しであり、再定義可能です。 よって、定義内容によって意味が変化しますので、ここでは説明しません。

代入式

=は変数類への代入を行うため、=を用いた式を特に代入式と呼びます。 右側に書かれた式の値を、左側に書かれた変数類に代入します。 なお、左側に書かれた内容によっては、変数類への代入ではなくメソッド呼び出しに置き換えられる場合があります。 単に代入が行われた場合は右側の式の値が、メソッド呼び出しに置き換えられた場合はそのメソッドの実行結果が、それぞれ代入式の値となります。

否定式

!式を否定式と呼び、!の右側に書かれた式の真偽を反転します。 slapには偽値はnullしか存在しないので、右側の式の値がnullでなければ、否定式の値はnullになります。 右側の式の値がnullの場合は、否定式の値は整数1になります。

複合否定式として、!=!~があります。 これらはまずそれぞれ、==式、=~式として評価が行われ、その値の真偽を反転したものを返します。

前置インクリメント式・前置デクリメント式

++を変数名の前に置いた式を前置インクリメント式と呼び、その変数に格納されたオブジェクトに対してsuccメソッドを呼び出した上で、その結果を式の値とします。 なお、変数には式の値が格納されます。

同様に、--を変数名の前に置いた式を前置デクリメント式と呼び、その変数に格納されたオブジェクトに対してpredメソッドを呼び出した上で、その結果を式の値とします。 なお、変数には式の値が格納されます。

var n = 1;
$p(++n);    # => 2
$p(n);      # => 2

後置インクリメント式・後置デクリメント式

++を変数名の後に置いた式を後置インクリメント式と呼び、その変数に格納されたオブジェクトに対してsuccメソッドを呼び出した上で、元の変数の値を式の値とします。 なお、変数にはsuccメソッドの返した値が格納されます。

同様に、--を変数名の後に置いた式を後置デクリメント式と呼び、その変数に格納されたオブジェクトに対してpredメソッドを呼び出した上で、元の変数の値を式の値とします。 なお、変数にはpredメソッドの返した値が格納されます。

var n = 1;
$p(n++);    # => 1
$p(n);      # => 2

論理演算式

&&式および||式を論理演算式と呼びます。 &&式はまず左側の式を評価し、その値が偽であればnullを、真であれば右側の式の値を返します。つまり、左側の式が偽であった場合、右側の式の評価は行われません。 ||式はまず左側の式を評価し、その値が真であればその値を、偽であれば右側の式の値を返します。つまり、左側の式が真であった場合、右側の式の評価は行われません。

ドット式

適切な名前が思いつかないのでドット式と呼んでいますが、インスタンス変数の所属を解決する式です。 .の左側を評価した結果のオブジェクトから、右側の識別子で指定されたインスタンス変数なりメソッドなりを取得します。または、代入式と組み合わされた場合はインスタンス変数への代入を行います。

名前空間解決式

ドット式と似ていますが、::の右側を評価した結果を名前空間とみなし、右側の識別子で指定された変数類を取得します。または、代入式と組み合わされた場合はその変数類への代入を行います。

条件式

?の左の式を評価し、その結果が真であれば?の右のうち:の左の式を、偽であれば:の右の式を、それぞれ評価し、その値を式の値とします。

# aの値が0なら「zero」、それ以外なら「non zero」を表示
$p(a == 0 ? "zero" : "non zero");

制御構造

条件分岐やループなどのことです。

条件分岐

if文

与えられた式を評価し、その結果が真であるか偽であるかによって処理を分岐します。 ありふれているのであまり言うことはありません。

if (a == 0) {
  $puts("a is zero.");
}
else if (a == 1) {
  $puts("a is one.");
}
else {
  $puts("a is anther.");
}

else部分(else if部分を含む)は省略可能です。 条件式を囲む括弧(( ))は省略できません。 また、真の場合あるいは偽の場合に実行される部分は必ず複文である必要があります(つまり中括弧({ })も省略できません)。

if文を式として評価した場合、その値はif文内で最後に評価された式の値となります。

ループ

while文

与えられた式を評価し、その結果が真である間、処理(複文)を繰り返します。 else節がある場合は、ない場合と同様に処理を繰り返した後、else節を実行します。

# 1~10までを表示する
var i = 0;
while (++i <= 10) {
  $p(i);
}
else {
  $p("finish");
}

while文を式として評価した場合、その値はwhile文内で(else節がある場合はそれも含んで)最後に評価された式の値となります。

until文

与えられた式を評価し、その結果が偽である間、処理を繰り返します。 else節がある場合は、ない場合と同様に処理を繰り返した後、else節を実行します。

# 1~10までを表示する
var i = 0;
until (++i > 10) {
  $p(i);
}
else {
  $p("finish");
}

until文を式として評価した場合、その値はuntil文内で(else節がある場合はそれも含んで)最後に評価された式の値となります。

do~while文

与えられた式を評価し、その結果が真である間、処理を繰り返しますが、最初の1回だけは無条件に実行されます。

# 1~10までを表示する
var i = 1;
do {
  $p(i);
} while (i++ <= 10);

dowhile文を式として評価した場合、その値はdowhile文内で最後に評価された式の値となります。

do~until文

与えられた式を評価し、その結果が偽である間、処理を繰り返しますが、最初の1回だけは無条件に実行されます。

# 1~10までを表示する
var i = 1;
do {
  $p(i);
} until (i++ > 10);

dountil文を式として評価した場合、その値はdountil文内で最後に評価された式の値となります。

例外処理

throw文

冷害を発生させます。いやそれはやませだよ! throw文が発生させるのは例外でした。 発生した例外を処理するようにプログラムが書かれていない場合、例外の発生はその場でプログラムの実行を終了させます。

# 例外RuntimeErrorを発生させる。
throw;

# ここには辿りつかない
$puts("never reach here.");

単にthrow文を実行するとRuntimeError例外が発生します。 throwの右側には式を置くことができます。 この式の評価結果は、例外クラス(Exceptionクラスの派生クラス)、例外クラスのインスタンス、文字列(Stringクラスのインスタンス)、のいずれかにならなければなりません。

# 例外RuntimeErrorを発生させる。
throw;

# これも例外RuntimeErrorを発生させる。
throw RuntimeError.new();

# メッセージつきで例外RuntimeErrorを発生させる。
throw "error!";

# メッセージ付きで例外ArgumentErrorを発生させる。適切な例ではないが。
throw ArgumentError.new("good bye!");

throw文を式として評価した場合の値は確かnullになるはずですが、throw文を評価した時点で処理がどっかに飛んでいってしまうため、その値を受け取る方法は存在しません。

try文

というわけで、throw文やその他の要因によって発生した例外を処理するためにtry文があります。 try文はtry節、catch節、finally節からなりますが、try節は一つのみ必須、catch節は0個以上、finally節は0個または1個で、この順番で並べる必要があります。 なお、catch節とfinally節の両方を省略することはできず、必ずいずれかが最低1つは必要です。

try節の複文ブロック内で例外が発生した場合、その例外のクラスに対応したcatch節があれば、そのcatch節の複文ブロックが実行されます。 なお、発生した例外のクラスに対応するcatch節が複数ある場合、それらのうち先頭のcatch節のブロックのみが実行されます。 try節で例外が発生したか否かに関わらず、try節またはcatch節の実行終了後、finally節のブロックが実行されます。

try {
  # 例外を発生させる
  throw;

  # これはもう実行されない
  $puts("never reach here.");
}
catch (RuntimeError ex) {
  $p(ex);  # => #<RuntimeError: >
}
finally {
  # こっちはcatch節の後で実行される
  $puts("comes here.");
}

catch節には対応する例外のクラスを指定することができます。 上記の例の(RuntimeError ex)がそうで、ここではRuntimeErrorに対応することが指定されており、実際に発生した例外インスタンスが新規ローカル変数exに代入されます。 例外クラスの対応は、指定した例外クラスの継承関係によって判断されます。 つまり、上記の例では、RuntimeErrorに限らず、その全ての派生クラスの例外がcatch節で処理されます。 例外クラス指定と例外を受け取るローカル変数名は、いずれも省略が可能です。 例外クラス指定を省略すると、現状は全ての例外がそのcatch節で処理されます、が、将来的にはRuntimeErrorとその派生クラスの例外のみが処理されるようになると思います。

try文は入れ子にすることができます。 内側のtry文内で発生した例外が、そのtry文内で処理されなかった場合、外側のtry文でその例外を処理することができます。

try文を式として評価した場合、例外が起きなければtry節のブロック内で最後に評価された式の値が、例外が起きてそれがcatch節で処理された場合はそのcatch節のブロック内で最後に評価された式の値が、それぞれ値となります。 finally節があってもこれは変わりません。

その他の制御構造

return文

return文は現在実行中のメソッドをその場で終了させます。 return文の右側には式を置くこともでき、その場合はその式を評価してからメソッドを終了します。 式を置かなかった場合は、nullを評価したものとみなしてメソッドを終了します。

def m1() {
  return 1;
  $puts("never reach here.");
}

def m2() {
  return;
  $puts("never reach here.");
}

$p(m1(), m2());  # 「1」 / 「null」

return文もthrow文と同じように、評価した時点で処理がどっかに飛んでいってしまうため、式として値を得ることはできません。 が、実質的には、右側に置いた式(あるいはnull)がその値であるとみなせないこともないかと思います。

break文

break文は現在実行中のループをその場で終了させます。 break文の右側には式を置くこともでき、その場合はその式を評価してからループを終了します。 式を置かなかった場合は、nullを評価したものとみなしてループを終了します。

なお、終了対象となるループがwhile文あるいはuntil文で、else節を持っている場合、通常のループ終了と異なり、else節は実行されません。

break文自体も式として値を得ることはできませんが以下略。

next文

next文は現在実行中のループをその場で次の繰り返しに進めます。 C等の言語におけるcontinue文に相当します。

next文の式の値を得ることはできませんが、ループ中最後に評価された文が結局next文だった場合、ループ文自体の値はnullになります。

import文

あんまり紹介したくないのですが、外部のプログラムを取り込んで、その場で書かれたかのように実行します。 取り込むべきプログラムを文字列で指定する必要があります。拡張子が.slpであれば拡張子は省略可能です。

なお、import文でプログラムの位置を絶対パスで指定することはできません。 プログラムの位置は定数LOAD_PATHに含まれるいずれかのパスからの相対パスで指定します。 言い換えると、取り込むプログラムは必ずLOAD_PATHに含まれるいずれかのパスから見て相対的に指定可能な位置に存在する必要があります。

将来のバージョンで仕様が変更される可能性があるので、使わないほうがいいでしょう。

using文

これもあんまり紹介したくないのですが、現在の名前空間において、指定した名前空間に存在する定数を探索可能とします。

将来のバージョンで仕様が変更される可能性があるので、使わないほうがいいでしょう。

メソッド呼び出し

メソッド呼び出し式

変数類の右に括弧をつけると、変数類の中身がメソッドであるとみなし、その括弧に囲まれた部分を引数としてメソッドを実行します。 変数類の中身がメソッドではなかった場合はTypeError例外が発生します。

var obj = Object.new();  # Objectクラスのインスタンスを生成
obj.display();           # そのメソッドdisplayを実行

display();               # ドット式でない場合はthisのメソッドが実行される

$p(1, 2, 3);             # グローバルメソッド$pに3つの引数を与えて実行

ブロック式(の値)を格納した変数類も、括弧をつけることによってその中身のブロック式を実行することができます。 というか、メソッドとブロック式の値は内部的には同じものです。

var meth = @(a){         # 仮引数aを取るブロック式を変数methに代入
  $p(a);
};

meth(-1);                # -1を引数としてmeth内のブロック式を実行
                         # => 「-1」

ブロック付きメソッド呼び出し

メソッド呼び出し式に続けてブロック式を書いた場合、メソッド呼び出しの最後の引数として、そのブロック式(の値)が渡されます。 さらに、続けて複数のブロック式を書いた場合、各々のブロック式(の値)が、その順で引数としてメソッドに渡されます。

$p() @(){};       # ブロック式 @(){} 自体が$pメソッドに渡される
                  # => 「#<Method:0x...>」

$p() @(){} @(){}; # ブロック式が2つ$pに渡される
                  # => 「#<Method:0x...>」 / 「#<Method:0x...>」

なお、ブロック式が一つだけで、そのブロック式が引数を取らない場合で、さらにその行がこのメソッド呼び出し式のみからなる場合、@および行末の;を省略可能です。

$p() {}           # 上記の例の1つ目はこう書くことができる
                  # => 「#<Method:0x...>」

super擬似メソッド呼び出し

あるメソッドが同名の別メソッドをオーバーライドしている場合に限り、そのメソッド内でsuper擬似メソッド呼び出しを使用することができます。 super擬似メソッド呼び出しを実行すると、オーバーライドされたメソッドが呼び出されます。 super擬似メソッド呼び出しに際しては、もちろん必要な引数リストを与えてやる必要があります。

def foo(a) {
  $p(a);
}

def override foo(x, y) {
  super(x+y);
}

foo(1, 2);   # => 3

クラス、名前空間、メソッドの定義

クラス定義

class文でクラスを定義できます。 クラスを定義する際には基底クラスを指定できて、その場合は当然指定したクラスを継承します。 基底クラスを指定しなかった場合は、Objectクラスを継承します。 クラス名には英大文字で始まる名前を指定します。つまり定数名ですが、これは要するにクラスオブジェクト(Classクラスのインスタンス)を定数に代入しているということを意味します。 クラス文には必ず複文ブロックを与える必要があります。 このブロック内では、いま定義しているクラス自体がthisになります。また、このブロックは外側のローカル変数スコープを参照できません。

既に定義済みのクラス名を使ってclass文を実行した場合、元のクラスが再び参照されます。 つまり、定義済みのクラスの内容を後から変更可能ということです。 なお、この際に、以前の定義と異なる基底クラスを指定した場合、または、基底クラスがObjectクラスでないのに基底クラス指定を省略した場合、TypeError例外が発生します。

# 「Foo」という名前のクラスを定義。基底クラスは省略されたのでObject
class Foo {
  $p(this);   # => 「Foo」
}

# Fooを継承して「Bar」という名前のクラスを定義
class Bar : Foo {
  $p(this);   # => 「Bar」
}

名前空間定義

偉そうに名前空間と呼んでいますが、rubyのmoduleから定数を保持するという意味以外の機能を取り除いた状態のものです。 将来的にはなんかもうちょっとあるかもしれませんが。

名前空間を定義するにはnamespace文を使います。 名前空間名には英大文字で始まる名前を指定します。 つまりclass文と同じように、指定した名前の定数に名前空間オブジェクト(NameSpaceクラスのインスタンス)を代入していることになります。 名前空間は継承したりされたりできないので、class文と異なり、親となる名前空間のようなものを指定することはできません。 名前空間は必ずその定義の行なわれた時点での名前空間の子となります。 名前空間には必ず複文ブロックを与える必要があります。 このブロック内では、いま定義している名前空間自体がthisになります。また、このブロック内の名前空間も今定義している名前空間自体になります。 class文の場合と同様、このブロックは外側のローカル変数スコープを参照できません。

既に定義済みの名前空間名を使ってnamespace文を実行した場合、元の名前空間が再び参照されます。

# 名前空間「Name1」を定義
namespace Name1 {
  $p(this);    # => Name1

  # Name1の子として名前空間「Name2」を定義
  namespace Name2 {
    $p(this);  # => Name2
  }
}

ところで、ClassクラスはNameSpaceクラスの派生クラスです。 ということはどういうことかというと、Classクラスのインスタンスであるクラスオブジェクトは、NameSpaceクラスのインスタンスとしての性質も持つことになります。 つまり、クラスもまた名前空間として機能します。

メソッド定義

メソッドはdef文で定義します。 functionとか長すぎでありえないですから。誰だよECMAScript設計した奴。 メソッド名、仮引数リスト、複文ブロックの順で並べます。 メソッド名というのは実質的には変数名ですので、インスタンス変数、グローバル変数、定数が指定可能です。 インスタンス変数が指定できるということは、つまり、ドット式を使用して、定義先オブジェクトを指定することが可能です。 仮引数リストはメソッドの実行時にブロック部分に対するローカル変数として定義されます。

メソッド名部分をもう少し詳しく説明しましょう。 まず、ドット式を使用した場合、実際のメソッド名部分(ドットの右側)にはインスタンス変数として有効な名前のみが指定可能です。 メソッド名にグローバル変数を使用する場合、当然、ドット式を使用することはできません。 また、定数をメソッド名として使用する場合、やはりドット式は使用できず、代わりに名前空間解決式が指定可能になります。

ドット式や名前空間解決式を使用せず、かつ、メソッド名がグローバル変数でもない場合、thisオブジェクトのインスタンス変数がメソッド定義の対象とみなされます。 が、特例として、class文中の場合のみ、thisではなくそのクラスのプロトタイプのインスタンス変数として取り扱われます。 class文中でその時点でのthis、すなわちクラスオブジェクトのインスタンス変数としてメソッドを定義したい場合は、明示的にthisをドット式の左側に指定する必要があります。

仮引数リストは括弧で囲まれ、カンマで区切られた、0個以上のローカル変数名の並びです。 任意の可変長の変数を受け取りたい場合は……まだ記法がありません。 単にローカル変数名を書くだけでなく、代入式を書くことにより、実引数が省略された場合のデフォルト値を指定しておくことができます。 代入式の右辺はメソッドが実行される時に必要に応じて評価されます。

ブロック部分はメソッド実行時に評価されます。 このブロックからは外のローカル変数スコープは参照できません。 ブロック内ではthisはそのメソッドがドット式等を使って呼び出された場合はそのドット式等の左側のオブジェクトになり、直接名前だけを指定して呼び出された場合はその時点でのthisになります。

# グローバルなメソッド「$m1」の定義
def $m1() {  # 引数なし
  $p(this);
}

class C {
  $m1();  # 先ほどの$m1を実行。この時点でのthisはクラスCなので、「C」を表示

  # クラスCのプロトタイプのメソッド「m2」の定義
  # 単に「クラスCのインスタンスメソッド」と考えるのが話が早い
  def m2(a) {  # 引数が1個
    $p(a, this);
  }

  # クラスCのメソッド「m3」の定義
  # いわゆる「クラスメソッド」と考えるとよい
  def this.m3(a, b=-1) {  # 引数が2個で2個目は省略可能(省略時は-1になる)
    $p(a, b, this);
  }
}

$m1();       # この時点のthisはmainというオブジェクト。なので「main」

C.m3(1);     # 「1」 / 「-1」 / 「C」
C.m3(2, 3);  # 「2」 / 「3」 / 「C」
var obj = C.new();
obj.m2(4);   # 「4」 / 「#<C:0x...>」

非常に大事なことを忘れていました。 class文中でインスタンスメソッドを定義するとき、そのクラスに既に同名のインスタンスメソッドあるいはインスタンス変数が存在する、あるいは、そのクラスにはなくても、そのクラスの基底クラスに存在する場合、OverrideError例外が発生します。 つまり、メソッド定義で既存の定義を単に上書きすることはできません。 既存の定義を上書きしたい場合、defの後にoverrideというキーワードを指定して、メソッド定義を上書きすることを明示する必要があります。

演算子メソッド定義

さて、既に述べたとおり、大抵の演算子式の実体は演算子メソッドであり、これらは必要に応じて定義可能です。 具体的には、単にdef文においてメソッド名として対象演算子を指定するだけです。 ただし、単項+演算子と単項-演算子は二項の演算子と名前が衝突しているので、それぞれ+_-_という名前で定義する必要があります。

class Integer : Numeric {
  # Integerに**演算子を定義する。たぶんそのうち組み込みになるだろうけど。
  def **(other) {
    var r = 1;
    other.times() @(n) {
      r = r * this;
    };
    r;
  }

  # 単項+演算子。既に定義されてるのでoverride。
  def override +_() {
    $p(this);
  }
}

$p(2**4); #=> 「16」
+5;       #=> 「5」

ブロック式ふたたび

さて、前にさらっと流したブロック式ですが、再度細かく説明します。 ブロック式というのは、無名でのメソッドの定義のようなものと考えることができます。 従って、メソッド定義で説明したことのうち名前に関すること以外のことは、ほぼそのまま成立します。 メソッド定義とブロック式との違いは、ブロック式のブロックからは、その外側のローカル変数のスコープが参照できるということです。

var a = 123;  # ローカル変数「a」の宣言

var foo = @() {
  $p(a);      # 外側のローカル変数「a」が見える
};

def bar() {
  $p(a);      # 外側のローカル変数は見えないので...
}

foo();        # => 「123」
bar();        # 例外NameErrorが発生

プロパティ

クラスには特殊なメソッドであるプロパティが定義可能です。 プロパティとは、単なるインスタンス変数のように見えるけれど、実はメソッド呼び出しに変換される、という機能です。 プロパティの定義には、ゲッターとセッターの2種類があります。 ゲッターはプロパティの参照時に呼び出され、セッターはプロパティへの代入時に呼び出されます。 ゲッターの定義にはget文を、セッターの定義にはset文を、それぞれ使用します。 これらはdef文に似ていますが、プロパティ名にドット式等を指定できない、仮引数リストを指定することができない、という違いがあります。 ゲッターには引数が存在しないわけですが、セッターには自動的にvalueという仮引数が定義され、呼び出し時の右辺の式の値が代入されます。

プロパティの定義にはドット式が使用できないため、定義時点でのthisオブジェクトがその対象となります。 ただし、def文と同じように、class文中ではそのクラスオブジェクトではなくプロトタイプに対するプロパティ定義となります。 クラスオブジェクトにプロパティを定義するには、えーと、えーと、えーと……現状は不可能です。

ゲッターとセッターには重複した名前を定義することができます。 というか、この二つをペアで定義することにより、普通のインスタンス変数のように参照も代入もできるように見えるものができあがります。 もちろん、必ずゲッターとセッターの両方を定義する必要はなく、どちらか一方だけを定義することも可能です。

# 「foo」という名前のプロパティに対するゲッターの定義
get foo {
  $puts("getter executed!");
  "foo";
}

# 「foo」という名前のプロパティに対するセッターの定義
set foo {
  $puts("setter executed!");
  $p(value);  # valueは暗黙の引数
}

$p(foo);  # => 「getter executed!」 / 「"foo"」
foo = 0;  # => 「setter executed!」 / 「0」
$p(foo);  # => 「getter executed!」 / 「"foo"」

言語仕様 - その他

トップレベル

プログラムの地の文の部分、何の定義文の中でもない部分を、「トップレベル」と呼びます。

mainオブジェクト

トップレベルにおけるthisはmainと呼ばれるオブジェクトです。 特に何をするでもないオブジェクトですが、グローバル変数の格納場所としての役割を担っています。

Main名前空間

トップレベルの名前空間はMainという名前の名前空間です。 全ての組み込み定数はこのMainに定義されています。 大きなプログラムを作る場合は、Main名前空間をあまり汚さないように、別の名前空間を用意した方がいいかもしれません。が、slapで大きなプログラムを作る人はいないからどうでもいいっすね。 名前空間解決式の左側に何も書かない場合、このMainを指定したものとして扱われます。

組み込みライブラリ

とか言うと組み込みじゃないライブラリもありそうに聞こえるわけですが、ありません。 だから今実行中のプログラム以外のスクリプトを別途読み込む機能自体がまだないんだってば!

組み込みグローバル変数

全てメソッドです。そのはずです。

$exit(num)
プログラムを終了するメソッド。 numで指定した値をインタプリタ自体の終了コードとする。
$p(...)
デバッグ用出力メソッド。引数であるオブジェクトをそれぞれ別の行に、適当な形式で出力する。 「適当な形式」とはそのオブジェクトに対してinspectメソッドを呼び出した結果を指すが、将来なんか変えるかもしれない。
$puts(...)
普通の出力メソッド。引数であるオブジェクトをそれぞれ別の行に、適当な形式で出力する。 実際は各オブジェクトのdisplayメソッドを呼び出しているだけなので、その定義具合によっては別のことが起きるかもしれない。 この挙動も将来変更されると思われる。
$rand(max = null)
乱数を生成する。 引数maxを与えた場合は0以上max未満の整数を、与えなかった場合は0以上RAND_MAX未満の整数を返す。なお、RAND_MAXはslapインタプリタをコンパイルした処理系依存の値である。 このメソッドの制限として、maxRAND_MAX以上の整数を指定してもあまり意味はない。 現在の実装では、内部的にはCのrand関数を利用しているので、擬似乱数生成器としてはあまり優秀ではない。 乱数の種は、$srandメソッドで事前に指定されていなかった場合、現在時刻等から適当に生成されるが、適当なのであまり信用しないこと。 このメソッドの挙動は将来変更されると思われる。
$srand(seed)
擬似乱数生成器に種を指定する。 以前に種が指定されていた場合、その値を返す。そうでなければnullオブジェクトを返す。 現在の実装では、内部的には単にCのsrand関数を呼んでいる。

組み込み定数

全てMain名前空間に定義されています。 なお、組み込みクラスも定数として存在するわけですが、それらは後ほど別途説明します。

ARGV
コマンドライン引数のうち、プログラム指定部分より後ろの部分がそれぞれ文字列として格納された配列。
GC
ガーベッジコレクション機構を制御するためのメソッドの入ったオブジェクト。 まだ役割とか真面目に検討してないので今回は説明を割愛。
LOAD_PATH
ライブラリ検索パス配列。 デフォルトではインタプリタ相対のlibディレクトリの絶対パスのみ。 -Iコマンドライン引数で追加しておくことが可能。 また実行時にもいじれないこともない。
Main
既に説明したとおり、トップレベルの名前空間。
PROGRAM
slapインタプリタを起動した際に使用された文字列。
SCRIPT
プログラム名を意味する文字列。パス部分が含まれるかどうかはその場の気分による。 プログラムが-eコマンドラインオプションで与えられた場合は"-e"となっている。
STDERR
標準エラー出力をラップしたIOクラスインスタンス。 しかし、現時点ではIOクラスには出力系メソッドがwriteメソッドしかないため、ほとんど何の役にも立たない。
STDIN
標準入力をラップしたIOクラスインスタンス。 幸い、readメソッドおよびeach_lineメソッドが存在するため、なんとか入力だけはできる。
STDOUT
標準出力をラップしたIOクラスインスタンス。 STDERRと同じく、何の役にも立たない。

組み込みクラス

組み込みのクラス群は以下のような継承関係を持ちます。

Object

オブジェクトクラス。 全ての悪の元凶です。

Objectクラス自体は以下のインスタンス変数を持ちます。

new(...)
インスタンスを生成するメソッド。 newメソッド自身は任意の数の引数を受け付ける。 newメソッドはインスタンスを生成した後、それを初期化するために_initメソッドを呼び出すが、その際に自分が受け取った引数を全てそのまま_initメソッドに引き渡す。

Objectクラスのインスタンスは、以下のインスタンス変数を持ちます。

+()
単項+演算子メソッド。 単に自分自身を返す。
==(obj)
==演算子メソッド。 ==演算子は、自分と引数objとのいい加減な比較を行なうことが期待されている。 Objectクラスの場合は、単に===演算子メソッドを呼び出す。
===(obj)
===演算子メソッド。 ===演算子は、自分と引数objとの完全な一致を調べることが期待されている。 =====の意味合いがrubyのそれとは異なることに注意。 Objectクラスの場合は、object_idの一致を調べている。 というか、他のクラスでも上書きするべきでないと思う。
=~(obj)
=~演算子メソッド。 =~演算子は、自分と引数objとの曖昧な比較を行なうことが期待されている。 Objectクラスの場合は、単に===演算子メソッドを呼び出す。
_init()
インスタンスを初期化するメソッド。 Objectクラスでは特に何もしていない。
class
そのオブジェクトの所属するクラスを返すプロパティ。 プロパティ名に予約語を使用している、よい子は真似してはいけない例。 なお、セッターはないので所属クラスをすげかえるような危険なことはできないことになっている。
clone()
そのオブジェクトの複製を返すメソッド。 複製というのは同じクラスに所属して同じインスタンス変数を持つ新規のオブジェクト、
display()
そのオブジェクトを適当な文字列形式で標準出力に出力するメソッド。 $putsメソッドからも呼び出されたりしている。
has(symbol)
そのオブジェクトが引数symbolで指定された名前のインスタンス変数を持っていれば真を、そうでなければ偽を返すメソッド。
hash
そのオブジェクトの内部ハッシュ値を返すプロパティ。
inspect()
そのオブジェクトを適当な文字列形式に変換するメソッド。 $pメソッドからも呼び出されたりしている。現代的な意味での「適当」な形式に変換してるので、過度の期待は禁物。
is_a(klass)
そのオブジェクトが引数klassで指定されたクラスに属せばklass(真)を、そうでなければ偽を返すメソッド。 自分が属するクラスとは、classプロパティで示されるものだけでなく、その基底クラス達を含むことに注意。
object_id
そのオブジェクトを一意に識別する整数値を返すプロパティ。 必ず0以上の整数になる。 なお、セッターはない。
slots
そのオブジェクトが持つインスタンス変数名の一覧をSymbolの配列として返すプロパティ。 なお、セッターはない。
to_s()
そのオブジェクトを適当な文字列形式に変換するメソッド。 displayメソッドはこちらを用いてオブジェクトの文字列形式を得ている。 Objectクラスではinspectメソッドと同じ。

AddrInfo

ソケット情報クラス。 Objectクラスを継承しています。 後述のSocketクラスと組み合わせて使うことを前提としたクラスです。

AddrInfoクラス自体は基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

tcp(host, port)
引数hostおよびportで指定されたTCPホストに対応したAddrInfoクラスのインスタンスを返すメソッド。
udp(host, serv)
引数hostおよびservで指定されたUDPホストに対応したAddrInfoクラスのインスタンスを返すメソッド。

AddrInfoクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

Array

配列クラス。 Objectクラスを継承しています。

Arrayクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Arrayクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

*(sep)
*演算子メソッド。 引数sepを省略できないことを除けばjoinメソッドと同じ。
[](index)
[]演算子メソッド。 引数indexで指定された順番の要素を返す。 indexが整数でなかった場合はTypeError例外が発生する。 indexが正数の場合、先頭の要素を0番目、その次を1番目、...として数え、indexが負数の場合、一番後ろの要素を-1番目、その前の要素を-2番目、...として数える。 indexが範囲外の場合はnullオブジェクトを返す。
[]=(index, value)
[]=演算子メソッド。 引数indexで指定された順番のところに引数valueで指定されたオブジェクトを代入する。 indexが整数でなかった場合はTypeError例外が発生する。 indexが正数の場合、先頭の要素を0番目、その次を1番目、...として数え、indexが負数の場合、一番後ろの要素を-1番目、その前の要素を-2番目、...として数える。 indexが範囲外の場合、正数であれば、自身をそのサイズまで拡大した上で代入する。 負数であればIndexError例外が発生する。
_init(...)
インスタンスを初期化するメソッド。 引数として渡されたオブジェクトを、渡された順で、自身の要素として格納する。
each(block)
自分の要素を一つずつ取り出し、引数blockへの引数として渡してblockを実行するメソッド。 blockがメソッドオブジェクトでなかった場合、TypeError例外が発生する。 最後に実行したblock呼び出しの値を返す。自分の要素が0個だった場合はnullを返す。
join(sep = null)
自分の要素を一つずつ取り出し、その要素に対して+メソッドを用いて全てを結合し、その結果を返すメソッド。 引数sepが与えられた場合は、個々の要素の間にsep+で結合する。
map(block)
eachメソッドと同じように、自分の要素を一つずつ取り出し、引数blockへの引数として渡してblockを実行するメソッド。 blockがメソッドオブジェクトでなかった場合、TypeError例外が発生する。 各block呼び出しの値をその順に格納した新しい配列オブジェクトを返す。自分の要素が0個だった場合は要素数0の配列を返す。
pop()
自分の末尾要素を取り出すメソッド。その末尾要素は取り除かれる。 取り出した要素を返す。自分の要素が0個だった場合はnullを返す。
push(obj)
引数objを自分の末尾の要素として追加するメソッド。 自分自身を返す。
shift()
自分の先頭要素を取り出すメソッド。その先頭要素は取り除かれる。 取り出した要素を返す。自分の要素が0個だった場合はnullを返す。
size
要素数を返すプロパティ。 セッターはないので要素数を勝手に変更することはできない。
unshift(obj)
引数objを自分の先頭の要素として追加するメソッド。 自分自身を返す。
uniq()
重複する要素を取り除いたコピーを返す。 重複する要素とはobject_idが同じものを指す。

Exception

例外基底クラス。 Objectクラスを継承しています。 ユーザーが新しい例外クラスを作成したい場合、このクラスではなくRuntimeErrorなど他のクラスから継承することをお勧めします。

Exceptionクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Exceptionクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

_init(msg)
インスタンスを初期化するメソッド。 引数として渡された文字列をmessageインスタンス変数に格納する。 また、呼び出された箇所情報をbacktraceインスタンス変数に格納する。
backtrace
インスタンスが作成された時点での箇所情報を格納した配列。 配列の各要素は、呼び出し元を示す文字列・呼び出し元のプログラム名・呼び出し元の行番号、を要素として持つ配列になっている。
inspect()
インスタンスをちょっと見やすいかもしれない形式の文字列に変換するメソッド。
message
インスタンスが作成された時に指定されたエラーメッセージを格納した文字列。
to_s()
インスタンスを割と見やすいかもしれない形式の文字列に変換するメソッド。

LoadError

プログラム読み込み失敗例外クラス。 Exceptionクラスを継承しています。 現状、コマンドライン引数で指定されたプログラムを読み込めなかった場合にのみ発生しています。

LoadErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

LoadErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

NoMemoryError

メモリ確保失敗例外クラス。 Exceptionクラスを継承しています。 メモリが足りなくなったら発生します。が、本当にちゃんとこの例外が発生するのか、それとも処理系がクラッシュして死ぬのか、まだ試していません。

NoMemoryErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

NoMemoryErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

RuntimeError

実行時エラー例外クラス。 Exceptionクラスを継承しています。 ユーザーが自前の例外クラスを作成したい場合、この辺から継承するのがお勧めです。 素のthrow文はこの例外を生成します。

RuntimeErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

RuntimeErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

ArgumentError

引数異常エラー例外クラス。 RuntimeErrorクラスを継承しています。 メソッドやブロック式に渡された引数の数がおかしい場合などに発生します。

ArgumentErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

ArgumentErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

IndexError

インデックス指定異常エラー例外クラス。 ArgumentErrorクラスを継承しています。 配列などの添字指定がおかしい場合などに発生します。

IndexErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

IndexErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

NameError

名前解決エラー例外クラス。 RuntimeErrorクラスを継承しています。 指定された名前の変数が見つからない場合に発生します。

NameErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

NameErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

NoMethodError

メソッド名解決エラー例外クラス。 NameErrorクラスを継承しています。 指定された名前のメソッドが見つからない場合に発生します。 slapの文法的に単なる変数名解決とメソッド名解決とが分離可能なので、いちおうNameErrorと別の例外を用意してあるわけですが、処理する側は単にNameError例外だけ拾った方がいいことが多いような気はします。

NoMethodErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

NoMethodErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

OverrideError

メソッドオーバーライドエラー例外クラス。 RuntimeErrorクラスを継承しています。 既に存在するのと同名のメソッドを定義しようとすると発生します。 意図的に上書きしようとしている場合はoverrideキーワードを指定してください。

OverrideErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

OverrideErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

SystemError

処理系外発生エラー例外クラス。 RuntimeErrorクラスを継承しています。 OS等に処理を渡したときにエラーが起きたら発生するエラーです。

SystemErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

SystemErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

IOError

I/Oエラー例外クラス。 SystemErrorクラスを継承しています。 I/O処理中にエラーが起きたら発生するエラーです。

IOErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

IOErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

RegexpError

正規表現エラー例外クラス。 RuntimeErrorクラスを継承しています。 正規表現のコンパイルに失敗した場合などに発生する例外です。

RegexpErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

RegexpErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

TypeError

型エラー例外クラス。 RuntimeErrorクラスを継承しています。 予期したのと異なるクラスに属するオブジェクトを処理してしまった場合に発生する例外です。 が、slapはなるべく型情報ではなくそのオブジェクトのインスタンス変数を使って処理を進めようとしますので(いわゆるDuckTypingです。まあプロトタイプベースの処理系なので当然ですが)、この例外が相応しいと思える場合でも、大抵はNameError例外やNoMethodError例外になってしまうのではないかと思います。

TypeErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

TypeErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

SyntaxError

文法エラー例外クラス。 Exceptionクラスを継承しています。 プログラムに文法上の誤りがある場合に発生する例外です。 文法上の誤りはプログラムの実行が開始される前に発生するため、原則としてこの例外を捕捉することはできません。

SyntaxErrorクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

SyntaxErrorクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

IO

入出力クラス。 Objectクラスを継承しています。 入出力を抽象化したクラスです。 自称「King of やっつけ仕事」。 Fileクラスと一緒におよそ10分で作られたクラスなので、本当に役立たずの代物です。

IOクラス自体は基底クラスから継承したインスタンス変数しか持ちません。 なお、newメソッドは削除されていますので、普通はIOクラスのインスタンスを新規に生成することはできません。

IOクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

_init(file, mode)
インスタンスを初期化するメソッド。 と言っても、IO.newメソッドが存在しない以上、ユーザーが普通に呼び出す方法はない。 実際には派生クラスであるFileクラスのインスタンスを初期化するために呼び出され、引数fileで指定されたファイルを引数modeで指定されたモードでオープンする。 filemodeは共に文字列で、後者はC言語標準ライブラリのfopen関数のモード引数と同じ意味を持つ。というか、そのままfopen関数に渡される。
close()
自分に結び付けられた入出力をクローズする。 nullを返す。 ちなみに、自分がまだオープンされた状態なのか、それとも既にクローズされてしまっているのか、を知る方法は、今のところ存在しない。
each_line(block)
自分に結び付けられた入出力から1行ずつ取り出し、その文字列を引数として、引数blockを実行する。 なお、各行の末尾の改行文字は削除されたりせずそのまま残される。 最後に実行されたblockの値を返す。
flush()
自分に結び付けられた入出力に対するフラッシュ処理を行う。 実際に何が起きるか(または起きないか)はその入出力に依存する。 nullを返す。
gets()
自分に結び付けられた入出力から1行取り出し、その文字列を返す。 末尾の改行文字は削除されたりせずそのまま残される。
puts(...)
自分に結び付けられた入出力に対し、引数である文字列を順次出力する。 各文字列の末尾に改行文字がない場合は、それぞれの出力時に改行文字を付加する。 引数を省略した場合は、空行を1行出力する。 nullを返す。
read(size = null)
自分に結び付けられた入出力から引数sizeで指定したバイト数を取り出し、その文字列を返す。 引数を省略した場合、または、指定サイズのデータが残っていない場合、残りの全てのデータを返す。
write(str, size = null)
自分に結び付けられた入出力に対し、文字列引数strを出力する。 引数sizeが渡された場合、str中指定されたバイト数のみを出力する。strが指定バイト数に満たない場合はstr全体を出力する。 実際に出力したバイト数を返す。

File

ファイル入出力クラス。 IOクラスを継承しています。 ファイルからの入出力を抽象化したクラスです。 IOクラスと一緒におよそ10分で作られたクラスなので、本当に役立たずの代物です。

Fileクラス自体は基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

basename(path)
引数pathで指定されたパス名のうち、ディレクトリ部分を取り除いた部分を返すメソッド。 手抜きなのでドライブレターとかUNCには正しくは対応していない。
dirname(path)
引数pathで指定されたパス名のうち、ディレクトリ部分だけを抜き出した部分を返すメソッド。 手抜きなのでドライブレターとかUNCには正しくは対応していない。
open(file, mode = "r", block = null)
ファイルをオープンし、それと結びついたFileクラスのインスタンスを生成するメソッド。 引数fileで指定されたファイルを、引数modeで指定されたモードでオープンする。 filemodeは共に文字列で、後者の内容はC言語標準ライブラリのfopen関数のモード指定に準じる。 modeは省略可能で、その場合、"r"が指定されたものとみなされる。 また、省略可能な引数blockがあり、指定された場合は生成されたインスタンスを引数としてblockを呼び出し、その後block内での例外の有無に関わらず、ファイルをクローズする。 blockが指定された場合はその値を、指定されなかった場合は生成したインスタンスを、それぞれ返す。

Fileクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。

Socket

ソケット入出力クラス。 IOクラスを継承しています。 ソケットからの入出力を(気持ち)抽象化したクラスです。なお、現状ではTCP/IPソケットのみに対応しています。

Socketクラス自体は基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

tcp(host, port)
引数hostおよびportで指定されたTCPホストに接続し、Socketクラスのインスタンスを返すメソッド。
udp(host, serv)
引数hostおよびservで指定されたUDPホストに接続し、Socketクラスのインスタンスを返すメソッド。

Socketクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

_init(famliy, type = null, protocol = null)
インスタンスを初期化するメソッド。引数familytypeprotocolの全てが指定された場合、それに対応したソケットを生成する。第一引数のみが指定された場合は、これをAddrInfoクラスのインスタンスとみなした上で、それに対応したソケットを生成する。
accept()
bind済みのソケットに対する接続を待ち、その接続に対する新しいソケットに対応した新しいSocketクラスのインスタンスを返すメソッド。
bind(address, serv)
引数addressおよびservで指定されたポートにソケットをbindするメソッド。
connect(host, serv)
引数hostおよびservで指定されたホストに接続するメソッド。
listen(log = 10)
ソケットに対してlistenを行うメソッド。

Map

連想配列クラス。 Objectクラスを継承しています。

Mapクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Mapクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

[](key)
[]演算子メソッド。 引数keyで指定されたキーに対応する要素の値を返す。 keyで指定されたキーに対応する要素が存在しない場合はnullオブジェクトを返す。
[]=(key, value)
[]=演算子メソッド。 引数keyをキー、引数valueを値として要素を格納する。 valueを返す。
_init(...)
インスタンスを初期化するメソッド。 引数として渡されたオブジェクトを、渡された順で、自身の要素として格納する。
each(block)
自分の要素をキーと値のペアとして一組ずつ取り出し、引数blockへの引数として配列で渡してblockを実行するメソッド。 blockがメソッドオブジェクトでなかった場合、TypeError例外が発生する。 最後に実行したblock呼び出しの値を返す。自分の要素が0個だった場合はnullを返す。
each_key(block)
自分の要素のキーを一つずつ取り出し、引数blockへの引数として渡してblockを実行するメソッド。 blockがメソッドオブジェクトでなかった場合、TypeError例外が発生する。 最後に実行したblock呼び出しの値を返す。自分の要素が0個だった場合はnullを返す。
each_pair(block)
eachメソッドと同じ。
each_value(block)
自分の要素の値を一つずつ取り出し、引数blockへの引数として渡してblockを実行するメソッド。 blockがメソッドオブジェクトでなかった場合、TypeError例外が発生する。 最後に実行したblock呼び出しの値を返す。自分の要素が0個だった場合はnullを返す。
keys()
自分の要素のキーを全て取り出して格納した配列を返す。 自分の要素が0個だった場合は空配列([])を返す。
size
要素数を返すプロパティ。 セッターはないので要素数を勝手に変更することはできない。
values()
自分の要素の値を全て取り出して格納した配列を返す。 自分の要素が0個だった場合は空配列([])を返す。

MatchData

正規表現マッチ結果クラス。 Objectクラスを継承しています。 正規表現のマッチ結果を抽象化したクラスです。

MatchDataクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

MatchDataクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

[](index)
[]演算子メソッド。 引数indexで指定した捕獲式に対するマッチ文字列を返す。 index0の場合は正規表現全体に対するマッチ文字列を返す。 indexで指定された捕獲式がない場合はIndexError例外が発生する。
begin(index)
引数indexで指定した捕獲式に対するマッチ開始位置を返す。 index0の場合は正規表現全体に対するマッチ開始位置を返す。 indexで指定された捕獲式がない場合はIndexError例外が発生する。
end(index)
引数indexで指定した捕獲式に対するマッチ終了位置(マッチした部分の次の文字の位置)を返す。 index0の場合は正規表現全体に対するマッチ終了位置を返す。 indexで指定された捕獲式がない場合はIndexError例外が発生する。
offset(index)
引数indexで指定した捕獲式に対するマッチ開始位置と終了位置を配列で返す。 index0の場合は正規表現全体に対するマッチ開始位置と終了位置を配列で返す。 indexで指定された捕獲式がない場合はIndexError例外が発生する。
pos
マッチ開始位置を返すプロパティ。 セッターはない。
regexp
元の正規表現を返すプロパティ。 セッターはない。
string
マッチ対象だった文字列を返すプロパティ。 セッターはない。

Method

メソッドクラス。 Objectクラスを継承しています。 メソッド・ブロック式を抽象化したクラスです。

Methodクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Methodクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

_init(block = null)
インスタンスを初期化するメソッド。 省略可能な引数blockが指定された場合、それをコピーする。 blockが省略された場合、空っぽの、つまり実行されると何もしないでnullを返すメソッドを生成する。
call(...)
自分自身を実行するメソッド。 渡された引数をそのまま自分自身への引数として渡す。 自分自身の実行結果を返す。

NameSpace

名前空間クラス。 Objectクラスを継承しています。 現状、定数スコープを作成・保持するためだけに存在します。

NameSpaceクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

NameSpaceクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

_init(name, prev = null)
インスタンスを初期化するメソッド。 引数nameはシンボルでなければならず、作成する名前空間名を指定する。 省略可能な引数prevにはその名前空間の上位となる名前空間オブジェクトを指定する。省略した場合は現在の名前空間が指定されたものとみなす。 なお、nameで指定された名前の定数が、prevで指定された名前空間(または指定されなければ現在の名前空間)に自動的に定義される。 これらの引数や挙動は将来変更されるような気がするので、NameSpace.newメソッドで名前空間を生成するようなコードは書かず、素直にnamespace文を使っておいた方が無難。
consts()
自分の名前空間に属する定数のシンボルを配列で返す。 自分の上位あるいは下位の名前空間に属する定数は含まない。
inspect()
単に名前空間名を文字列で返すメソッド。
name
名前空間名がシンボルで入っているはず。 単なるインスタンス変数なので書き換えることができるが、やめておいた方がいいと思う。 将来はプロパティになるかもしれない。
to_s()
inspectメソッドと同じ。

Class

クラスのクラス。 NameSpaceクラスを継承しています。 クラスのクラスなのでクラスに必要な機能を保持しています。自分で書いてて何言ってるのかわかりません。

Classクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Classクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

_init(name, base = null)
インスタンスを初期化するメソッド。 引数nameはシンボルでなければならず、作成するクラス名を指定する。 省略可能な引数baseにはそのクラスの基底クラスとなるクラスオブジェクトを指定する。省略した場合はObjectが指定されたものとみなす。 なお、nameで指定された名前の定数が現在の名前空間に自動的に定義される。 これらの引数や挙動は将来変更されるような気がするので、Class.newメソッドでクラスを生成するようなコードは書かず、素直にclass文を使っておいた方が無難。
ancestors
該当クラスの継承関係を配列で返すプロパティ。セッターはない。
base
基底クラスを返すプロパティ。セッターはない。
new(...)
そのクラスのインスタンスを生成する。 引数は、全てそのまま、生成されたインスタンスの_initメソッドに引き渡される。 生成されたインスタンスを返す。

Numeric

数値クラス。 Objectクラスを継承しています。 いわゆる抽象クラスです。なので、何もしないし何もできません。

Numericクラス自体は基底クラスから継承したインスタンス変数しか持ちません。 なお、newメソッドは削除されていますので、普通はNumericクラスのインスタンス生成することはできません。

Numericクラスのインスタンスは、基底クラスから継承したインスタンス変数しか持ちません。 なお、cloneメソッドは削除されていますので、Numericクラスのインスタンスを複製することはできません。

Integer

整数クラス。 Numericクラスを継承しています。 全ての整数を扱うクラスですが、割といい加減な作りなので、ときどき思いもよらないことが起きます。 将来はNumericクラスを直接継承するのではなく、間に別のクラスが挟まる形になると思われます。

Integerクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Integerクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

-()
単項-演算子メソッド。 符号を反転した値を返す。
+(other)
二項+演算子メソッド。 自身の値と引数otherの値を加算した値を返す。 現状、otherが整数オブジェクトでない場合、TypeError例外が発生する。 将来はotherが整数以外の数値オブジェクトであれば、otherのクラスのインスタンスを返すようになると予想される。
-(other)
二項-演算子メソッド。 自身の値から引数otherの値を減算した値を返す。 現状、otherが整数オブジェクトでない場合、TypeError例外が発生する。 将来はotherが整数以外の数値オブジェクトであれば、otherのクラスのインスタンスを返すようになると予想される。
*(other)
*演算子メソッド。 自身の値に引数otherの値を乗じた値を返す。 現状、otherが整数オブジェクトでない場合、TypeError例外が発生する。 将来はotherが整数以外の数値オブジェクトであれば、otherのクラスのインスタンスを返すようになると予想される。
/(other)
/演算子メソッド。 自身の値を引数otherの値で割った値を返す。 現状、otherが整数オブジェクトでない場合、TypeError例外が発生する。 将来はotherが整数以外の数値オブジェクトであれば、otherのクラスのインスタンスを返すようになると予想される。 また、otherが整数であっても、現状行なっている整除ではなく、正確な除算を行って別のクラスのインスタンスを返すようになる可能性がある。
%(other)
%演算子メソッド。 自身の値を引数otherの値で整除した場合の余りを返す。 otherが整数オブジェクトでない場合、TypeError例外が発生する。
<(other)
<演算子メソッド。 自身の値と引数otherを比較し、自身が小さければ真を、そうでなければ偽を返す。 otherが整数オブジェクトでない場合、TypeError例外が発生する。
<=(other)
<=演算子メソッド。 自身の値と引数otherを比較し、自身が小さいか等しければ真を、そうでなければ偽を返す。 otherが整数オブジェクトでない場合、TypeError例外が発生する。
>(other)
>演算子メソッド。 自身の値と引数otherを比較し、自身が大きければ真を、そうでなければ偽を返す。 otherが整数オブジェクトでない場合、TypeError例外が発生する。
>=(other)
>=演算子メソッド。 自身の値と引数otherを比較し、自身が大きいか等しければ真を、そうでなければ偽を返す。 otherが整数オブジェクトでない場合、TypeError例外が発生する。
chr()
数値を文字コードとみなして対応する文字(に対応する文字列)を返すメソッド。 なお使用する文字コード表はUnicodeであり、UTF-8でエンコーディングされる。
inspect()
単に数値を文字列で返すメソッド。
pred()
自身の値から1を減算した値を返す。
succ()
自身の値に1を加算した値を返す。
times(block)
自分の値に相当する回数だけ引数blockを呼び出すメソッド。 blockには現在の繰り返し回数を0始まりで数えた値が引数として渡される。 最後に実行さればblockの値を返す。
to_s()
inspectメソッドと同じ。

Regexp

正規表現クラス。 Objectクラスを継承しています。 正規表現を取り扱うクラスです。

Regexpクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Regexpクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

=~(str)
=~演算子メソッド。 自分を引数str文字列に対してマッチさせ、マッチに成功すればMatchDataオブジェクトを返す。 マッチに失敗すればnullを返す。
_init(src)
インスタンスを初期化するメソッド。 引数src文字列を正規表現としてコンパイルする。
inspect()
自分を適当な文字列形式に変換するメソッド。
source
自分を生成する元となった文字列を返すプロパティ。 セッターはない。
to_s()
現状はsourceと同じ。

String

文字列クラス。 Objectクラスを継承しています。 文字列を取り扱うクラスです。 実装的にはmutableなのですが、スクリプトレベルでできる操作は現状immutableなものだけです。 将来的にどっちにするかはまだ未定です。

Stringクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Stringクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

+(str)
二項+演算子メソッド。 自分の後ろに引数strを接続した文字列を返す。
[](index)
[]演算子メソッド。 引数indexで指定した位置のバイトを数値として返すメソッド。 indexが正数の場合、先頭のバイトを0番目、その次を1番目、...として数え、indexが負数の場合、一番後ろのバイトを-1番目、その前のバイトを-2番目、...として数える。 範囲外の場合はnullを返す。
_init(str = "")
インスタンスを初期化するメソッド。 省略可能な引数strのコピーを生成する。 strが省略された場合は空文字列を生成する。
chr(index = 0)
引数indexで指定した位置の文字(に相当する文字列)を返すメソッド。 ここで「位置」はバイト単位でなく文字単位で数えたものを指す。
inspect()
単に自分を返すメソッド。
intern()
自分をSymbolオブジェクトに変換した値を返す。
length
自分の長さを文字単位で返すプロパティ。セッターはない。 なおUTF-8でエンコーディングされていると仮定される。
ord(index = 0)
引数indexで指定した位置の文字の文字コードを返すメソッド。 なお、位置はバイト単位でなく文字単位で数えたものを指す。 また文字コード表はUnicodeである。
size
自分の長さをバイト単位で返すプロパティ。セッターはない。
to_i()
自分を数値の文字列表現とみなした場合のその数値を返す。 数値の文字列表現に該当しない文字に出会った時点で評価を打ち切るので、数値の文字列表現が先頭に含まれない場合は0を返す。
to_s()
inspectメソッドと同じ。
to_sym()
internメソッドと同じ。

Struct

構造体生成クラス。 Objectクラスを継承しています。 所定のインスタンス変数を持つだけのクラスを簡単に定義するためのサポートクラスです。 わかりにくいと思うので、例を示します。

Struct.new(:X, :foo, :bar);  # 構造体クラスXを定義する
var x = X.new(1, 2);         # Xのインスタンスxを生成する。
var y = X.new(3);            # Xのインスタンスyを生成する。名前の数に対して
                             # 値の数が少ないので、足りない分はnullになる。
$p(x.foo);                   # => 1
$p(x.bar);                   # => 2
$p(y.foo);                   # => 3
$p(y.bar);                   # => null

Structクラス自体は基底クラスから継承したインスタンス変数しか持ちません。

Symbolクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。

_init(name, ...)
インスタンスを初期化するメソッド。 nameで指定された名前の構造体クラスを生成する。 省略可能な引数群によって、その構造体クラスが持つインスタンス変数の名前を指定する。

Symbol

シンボルクラス。 Objectクラスを継承しています。 文字列と結びついた値であるオブジェクトです。説明難しいな。

Symbolクラス自体は基底クラスから継承したインスタンス変数しか持ちません。 なお、newメソッドは削除されていますので、普通はSymbolクラスのインスタンス生成することはできません。

Symbolクラスのインスタンスは、基底クラスから継承したもの以外に、以下のインスタンス変数を持ちます。 なお、cloneメソッドは削除されていますので、Symbolクラスのインスタンスを複製することはできません。

inspect()
自分を適当な文字列形式に変換するメソッド。
to_i()
シンボルオブジェクト間で一意な謎の数値を返すメソッド。
to_s()
自分と結びついた文字列を返すメソッド。