何故Xtalは変数定義構文を持つ?

Xtalでは

変数名 : 初期値;

という書式で変数の定義が出来ます。スクリプト言語と呼ばれるモノの多くは、この明示的な変数の宣言の構文を持たず、最初の代入式がそれを兼ねるものが多い中、何故こういう方式を採用したのか、を説明します。

Xtalは {} が変数のスコープを形成します。

 foo : 5;
 {
   foo : 10;
   println(foo); // => 10
 }
 println(foo); // => 5

JavaScriptは{}で変数スコープが形成されないので、同様の書き方をすると二つ目のprintlnは10になってしまいます。JavaScriptで書いているときに微妙に戸惑う部分です。

さて、Xtalのように{}でスコープが形成できる言語で、変数の定義構文を持たず、最初の代入が定義を兼ねる、という方式だとどうなるでしょう?

 foo = 5;
 {
   foo = 10; // さて、これは定義なのか、外側の変数への代入なのか?
 }

Rubyでもブロックで同様の混乱が(少なくとも私個人は)起こります。

 foo = 5
 100.times{
   foo = 10 # 宣言?代入?
 }

Rubyでは、外側に既に同名のローカル変数があると代入になり、無い場合はそのブロック内だけで有効な変数となります。

変数スコープをあまり形成しないRuby等ではこれで大抵は上手くいきますが、Xtalでは無謀です。なぜなら、{}だけでなく、classやmoduleもローカル変数スコープを形成するからです。

 Foo : class{
   goo : method(){ 
     // ここではgooもFooもBarもローカル変数としてアクセスできる
   }

   Bar : class{
     hoge : method(){
       // ここではhogeにもBarにもgooにもFooにもローカル変数としてアクセスできる
     }
   }
 }

この問題は、変数定義構文を持つだけで簡単に解決できます。「スクリプトは簡潔であるべきだ!」という声に答えるため、代入の'=' を コロン ':' に変えるだけ、という書式を採用しています。