このページの内容

構文

Wrenの構文は、Cに似た言語を使ってきた人にとってなじみがあり、その一方で少し単純で無駄の少ないものになるよう設計されています。

スクリプトは、拡張子が.wrenのプレーンテキストファイルに保存します。Wrenは事前コンパイルを行いません。一般的なスクリプト言語と同様、ソースから直接、上から下へプログラムを実行します。(内部では効率のためにバイトコードへコンパイルしますが、これは実装上の詳細です。)

コメント #

行コメントは//で始まり、行末で終わります。


// This is a comment.

ブロックコメントは/*で始まり、*/で終わります。複数行にまたがることができます。


/* This
   is
   a
   multi-line
   comment. */

Cとは異なり、Wrenではブロックコメントを入れ子にできます。


/* This is /* a nested */ comment. */

これは、すでにブロックコメントを含むコードでも、ブロック全体を簡単にコメントアウトできるので便利です。

予約語 #

その言語らしさを手早くつかむには、どの語が予約されているかを見る方法があります。Wrenの予約語は次のとおりです。


as break class construct continue else false for foreign if import
in is null return static super this true var while

識別子 #

名前の規則は、ほかのプログラミング言語と似ています。識別子は英字またはアンダースコアで始まり、英字・数字・アンダースコアを含められます。大文字と小文字は区別します。


hi
camelCase
PascalCase
_under_score
abc123
ALL_CAPS

アンダースコア(_)で始まる識別子は、Wrenでは特別な意味を持ちます。クラスのフィールドを表すために使います。

改行 #

改行(\n)はWrenでは意味を持ち、文を区切るために使われます。


// Two statements:
System.print("hi") // Newline.
System.print("bye")

ただし、一つの文が一行に収まらず、途中に改行を入れると問題になる場合もあります。そのためWrenには、とても単純な規則があります。文の終わりになれないトークンの直後にある改行を無視します。


System.print( // Newline here is ignored.
    "hi")

実際には、各文を別々の行に書き、必要に応じて複数行に折り返しても、それほど困らないということです。

ブロック #

Wrenでは波括弧でブロックを定義します。制御フローの文など、文を書ける場所ならどこでもブロックを使えます。メソッドや関数の本体もブロックです。例えば次のコードでは、then側にブロックを、else側に単独の文を使っています。


if (happy && knowIt) {
  hands.clap()
} else System.print("sad")

ブロックには、似てはいるものの同じではない二つの形式があります。通常、ブロックには次のように一連の文を入れます。


{
  System.print("one")
  System.print("two")
  System.print("three")
}

この形式をメソッドや関数の本体に使うと、ブロックの実行が終わった後、自動的にnullを返します。別の値を返したい場合は、明示的なreturn文が必要です。

しかし、一つの式を評価してその結果を返すだけのメソッドや関数もよく使われます。ほかの言語には、その定義に=>を使うものがあります。Wrenでは次のように書きます。


{ "single expression" }

{の後(関数の場合は引数リストの後)に改行がなければ、ブロックには一つの式しか入れられず、その結果を自動的に返します。これは、次のように書くのとまったく同じです。


{
  return "single expression"
}

この形式では、値を生まない文は使えません。つまり、class、for、if、import、return、var、whileで始まるものは書けません。一つだけ文を含むブロックにしたい場合は、そこに改行を入れます。


{
  if (happy) {
    System.print("I'm feelin' it!")
  }
}

{の直後に改行を置くというのは、少し奇妙で魔法めいて感じられます。しかし、Wrenではもともと改行が意味を持つので、それほど不自然ではありません。=>のような構文と比べてよい点は、ブロックの終わりに明示的な区切りがあることです。これは、呼び出しを連鎖させるときに役立ちます。


numbers.map {|n| n * 2 }.where {|n| n < 100 }

優先順位と結合性 #

Wrenの各種の式とその意味は、次の数ページで説明します。ただし、構文上それらがどう組み合わさるかを知りたい場合のために、一覧表を示します。

この表は、どの式の優先順位が高いか、つまりどれがより強く結び付くかと、同種の式が連続するときにどの順番でまとまるかという結合性を示します。Wrenは、おおむねCに従いますが、ビット演算子の誤りを修正しています。強く結び付くものから弱いものへの、全優先順位表は次のとおりです。

優先順位 演算子 説明 結合方向
1 () [] . グループ化、添字、メソッド呼び出し 左
2 - ! ~ 符号反転、論理否定、補数 右
3 * / % 乗算、除算、剰余 左
4 + - 加算、減算 左
5 .. ... 終点を含む範囲、終点を含まない範囲 左
6 << >> 左シフト、右シフト 左
7 & ビット単位のAND 左
8 ^ ビット単位のXOR 左
9 | ビット単位のOR 左
10 < <= > >= 比較 左
11 is 型の検査 左
12 == != 等価、非等価 左
13 && 論理AND 左
14 || 論理OR 左
15 ?: 条件式 右
16 = 代入、セッター 右



値 →← はじめに