そら豆スクリプト:文法と書き方

※「catch.jp-wiki」から移動したページです。

現在のそら豆スクリプト(SoraMame.ps.js)は、コードをProcessing.jsに変換して実行します。

コマンドリファレンスは、こちらにあります。

主な機能

  • Webブラウザで動作するビジュアルデザイン用のプログラミング言語
  • 覚えやすい簡単な文法
  • オブジェクト指向をサポート
  • WebGLによる3D表示

文字の種類

そら豆スクリプトでは、コードを書くための文字を次のように分類しています。

助詞

以下の文字は、助詞として特別扱いします。

と、に、を、の、で
は

とくに、「は」はデータ型の宣言に使います。

これらの文字は、変数名や関数名に使用できません。

読点

「、」(全角-読点)は、オブジェクトのメソッド呼び出しに使います。

数字

10進表記

124 , 3.14 , -2.3
  • 半角数字
  • 全角数字
  • ".""."で小数点以下を表現します

16進表記

カラー型のデータなどを16進表記で記述できます。

#FF00 , #2234
  • 先頭は「#」
  • 数値は、0-9, a-f, A-F
  • すべて半角

記号

次の記号は、そら豆スクリプトで特別な役割を持っています。

= + - * / % ^ ( ) [ ] { } . , : @ ! & | < > #
= + - × * ÷ / % ^( ) [ ] { } .  。 : @ ! & | < > 「」『』 #

これ以外の記号は、ふつうの文字として自由に利用できます。

「、」(全角-読点)は、特別な記号として扱っています。

文字列

文字列(もじれつ)とは、プログラム中の文字によるデータのことです。

文字列は、次の2つのどちらかのカッコのペアで、はさみます。

  • 「 ~ 」
  • 『 ~ 』

基本的なこと

文末

文末は、次のどちらかで判断します。

  • 改行
  • 。(句点)

言葉と言葉の区切り

日本語では、ほとんどの場合、言葉と言葉の間に空白をおきません。

そのために、プログラムとして言葉の判別が難しくなっています。

そこで、そら豆スクリプトでは、文中の言葉の区切りを、

「助詞」、「数字」、「記号」、「文字列」で判別します。

変数名と命令語名(関数・メソッド)に使える文字

全角文字と半角文字のほとんど。

ただし、以下をのぞきます

  • 助詞
  • 記号
  • もともと登録済みの変数名と関数名
  • 数字(1文字目のみ)

とくに、最初の1文字に数字は使えません。

文法1 - データ

変数の名前

変数は、名前の前に'@'を記述します。

@マウスX
@幅
@点数

@のあとには、日本語や英語をそのまま使えます。2文字目以降には数字も使えます。

定数とキーワード

値が変化しないデータは、定数にします。また、システム上で指定が必要な単語や定数は、キーワードとなります。

定数とキーワードは、名前の前に'$'を記述します。

$P3D
$PI

@のあとには、日本語や英語をそのまま使えます。2文字目以降には数字も使えます。

データ型

変数名のあとには、次のように助詞(は)で、データ型を宣言できます。

@点数は整数型
@メッセージは文字型

変数名のデータ型を指定した直後に、初期値を代入することもできます。

@点数は整数型 = 0
@メッセージは文字型 =「あ」

基本データ型

次のデータ型は、基本データ型としてデータ型の宣言なしで利用できます。

整数型
実数型
文字型
正否型
カラー型

組み込みデータ型

「組み込みデータ型」とは、より高度な機能をもったデータ型で、基本データ型と少し使い方が違います。

「組み込みデータ型」は、ひとつのデータ型で複数の値をまとめたり、値に対する特別な機能や操作(メソッド)を備えています(オブジェクト指向の組み込みオブジェクトに相当します)。

このようなデータ型を使うには、変数名のあとには、次のように助詞(は)で、データ型を宣言します。 ここは、先ほどと同じ。

@vはPベクトル型

変数名に、初期値を入力するには、次のように「新しい」命令を使います。

@vはPベクトル型
@v = 新しい{x:10, y:20, z:40}のPベクトル型

これは、次のようにひとつにまとめることもできます。

@vはPベクトル型 = 新しい{x:10, y:20, z:40}のPベクトル型

個々の値は、次のようにして利用できます。

@vの@x = 100

また、データ型に対する特別な操作は、次のように呼び出します。

@v、{x:100, y:200, z:400}に設定する

配列

配列は、複数のデータを番号をつけて扱う機能です。

次のように、記述します。

@プレイヤー[1] = 7
@プレイヤー[2] = 34
@プレイヤー[3] = 240

配列を使うには、次のように宣言します。

@(配列名)は(データ型)[]

あらかじめ配列の個数を宣言したい場合には、次のように書きます。

@(配列名)は(データ型)[] = 新しい(データ型)[(個数)]

ちょっと特別な書き方ですが、先ほどの組み込みデータ型や、あとで出てくる独自データ型と同じスタイルになっています。

文法2 - 式

とりあえず、数式、論理式(条件式)が使えます。

詳しくは、コマンドリファレンスの「算術記号」「比較記号」「論理演算記号」を参照ください。

文法3 - 構文

コメント文

先頭また文中に、「//」を書くと、以降はコメント文になり、プログラムの実行時に無視されます。

//これ以降は、コメント文

ブロックコメントは、準備中。

実行文

実行文は、引数の並びに続いて、命令語をおきます。

例
{幅:250, 高さ:250}のサイズ
{x:マウスX, y:マウスY}に{幅:10, 高さ:10}のマル

この例で命令語にあたるのは、「サイズ」「マル」です。

引数

引数は、「引数名」と「値」の2つを組み合わせ、それを「{}」で囲んで、助詞でつなぎます。

  • {引数名:値,・・・}
  • 次の4つの助詞(と、に、を、の、で)

引数は、記述した順番に(実は)依存します。

引数名と助詞の種類・順番は、無視されます。

さきほどの例で、引数にあたるのは

{幅:250, 高さ:250}の
{x:マウスX, y:マウスY}に{幅:10, 高さ:10}の

です。

代入文

次のように記述して、代入先の変数に、代入元の値を入れます。

(代入先) = (代入元)
@点数 = 0

代入元には式(数式、論理式)を利用できます。

@点数 = 3 + 2

データ型のところで説明したように、データ型の宣言に続いて、初期値を代入することもできます。

@点数は整数型 = 0
@メッセージは文字型 =「あ」

組み込みデータ型のところで説明したように、「新しい」命令とセットで使うこともできます。

@vはPベクトル型 = 新しい{x:10, y:20, z:40}のPベクトル型

また、代入演算子も使えます。

@点数 += 10

詳しくは、コマンドリファレンスの「代入記号」を参照ください。

もし文

次の2つの書き方があります。

もし{条件:条件式}ならば
   {//ここを実行}
もし{条件:条件式}ならば
   {//ここを実行}
ちがえば
   {//ここを実行}

条件式については、コマンドリファレンスの「比較記号」「論理演算記号」を参照ください。

くり返し文

指定した値から指定した条件まで、処理をくり返します。

次のように書きます。

{開始:@iは整数型 = 0 , 条件:@i &lt; 100 ,変化:@i += 1}のくりかえし{
  {x:@i, y:@i}{:30, 高さ:30}のマル
}

あいだ文

特定の条件の間、処理をくり返します。

次のように書きます。

@yは整数型 = 0
 {条件:@y &lt; @高さ}のあいだ{
  {x:50, y:@y}{:30, 高さ:30}のマル
  @y += 20
}

自分なりの命令語を追加する

自分なりの命令語を定義しておくと、ほかの場所から自由に呼び出すことができます。

特定の処理をまとめておいたり、プログラムを分かりやすくするために使います。

命令語の定義

命令語を定義すると、関数やメソッドとして利用できます。

また、「初期設定する」や「くり返し描画する」のように、あらかじめ決められた命令語をプログラム中で定義すると、プログラムの実行環境から呼び出される場合もあります。

命令語の定義には、次の4種類の書き方があります。

---(命令語名){//ここを実行}
---(命令語名)は(戻り値データ型){//ここを実行}
---{引数名1:値1, ...}(助詞){引数名2:値2, ...}(助詞)(命令語名){//ここを実行}
---{引数名1:値1, ...}(助詞){引数名2:値2, ...}(助詞)(命令語名)は(データ型){//ここを実行}

最後の(戻り値データ型)を指定している場合は、戻り値のデータ型を指定します。

戻り値なしの場合は省略します(void)。

以下、サンプル

---実行する{
  //ここを実行
}
---実行するは整数型{
  //ここを実行
  {戻り値:100}でもどる
}
---{引数:@xは整数型}で実行する{
  //ここを実行
}
---{引数:@xは整数型}で実行するは実数型{
  //ここを実行
  {戻り値:10.2}でもどる
}

型(クラス)の利用

「型」は、自分なりのデータ型を作成する機能です。ひとつの型に複数のデータをまとめたり、データと命令を組み合わせておくことができます。作成した型は、データ型と同じように使うことができます。

型の定義

次のように書きます。

===(型名) {
  //ここに型定義を書く
  (型が持つデータ)
+++(初期命令){
  }
---(独自命令){
  }
}

初期命令は、その型をもったデータを作るとき、最初に呼び出す命令です。型名と同じ名前にします。引数を指定でき、戻り値は省略します。

独自命令は、そのデータ型の専用命令です(オブジェクト指向のメソッドにあたります)。さきほど説明した、独自命令の定義と書き方は同じです。

型の利用

定義した型を利用するには、まず型を代入する変数を定義します。それから「新しい」命令といっしょに呼び出して、変数に代入します。このとき、引数を指定して初期値を代入できます。初期命令と型名は同じ名前になっています。

@(変数名)は(型名)
@(変数名)=新しい(初期命令) #「新しく」も使えます

型が持つ独自命令を呼び出すには、次のようにします。

@(変数名)、(独自命令)
@(変数名)、(引数)(独自命令)

型が持つ独自データを呼び出すには、次のようにします。

@(変数名)の@(独自データ)

Processing.jsのメソッドやプロパティを追加する方法

そら豆スクリプト(soramame.ps.js)は、日本語っぽいコードをProcessing.jsのコードに変換して実行します。
そら豆スクリプトの命令や環境変数を、Processing.jsのどのメソッドやプロパティに対応付けるかは、あらかじめ設定してあります。
この設定を追加することで、新しい命令や変数をサポートできます。

設定ファイル

設定を追加するには、「lib_command.js」ファイルを編集します。
下記は、「lib_command.js」の一部です。

//変換候補データ - 命令
//元データ : 変換先データ
  this.commands = {
    //Structure
    サイズ : 'size',
    初期設定する : 'setup',
    くり返し描画する : 'draw',
    もどる : 'return',

このファイルに、次のような形式で、変換前の単語(そら豆)と変換後の単語(Processing)を対応付けます。
末尾の「,」(コンマ)を忘れないようにしましょう。

    (そら豆) : '(Processing)',

ファイル変更後にやること

このファイルを書き換えたら、Webブラウザをリロードするだけ

設定ファイルの内容

「lib_command.js」には、次の4つの種類を記述できます。

命令

命令語をメソッドに変換します。
引数を持つことができます。

  • 例: テン : 'point',
  • 例: セン: 'line',

環境変数・定数

環境変数や定数名に変換します。

そら豆スクリプトのコード内で記述するときには、 環境変数には先頭に「@」を付けます。

  • 例: 幅 : 'width',
  • 例: 高さ : 'height',
  • 例: マウスX : 'mouseX',
  • 例: マウスY : 'mouseY',

定数には先頭に「$」を付けます。

  • 例: PI : 'PI',
  • 例: HALF_PI : 'HALF_PI',

データ型名(基本データ型と組み込みデータ型)

データ型名やクラス名に変換します。
そら豆スクリプトのコード内で記述するときには、
「変数名は(データ型名)」と記述します。

  • 例: 整数型 : 'int',
  • 例: 実数型 : 'float',
  • 例: Pイメージ型 : 'PImage',
  • 例: Pベクトル型 : 'PVector',
  • 例: Pフォント型 : 'PFont',

プロパティ名・メソッド名

特定のクラスに属するプロパティ名・メソッド名に変換します。
そら豆スクリプト側は、属するクラス名(変換後)と、プロパティ名・メソッド名(変換前)を
"_"(アンダーバー)でつなぎます。

  • 例: PVector_x : 'x',
  • 例: PVector_y : 'y',
  • 例: PVector_z : 'z',
  • 例: PVector_取りだし : 'get',
  • 例: PVector_設定する : 'set',

さらに詳しく

そら豆スクリプトは、C言語やJava・Rubyといった、広く普及しているALGOL系プログラミング言語と同じような文法を備えています。

とくに、基本的な考え方は、Javaによく似ています。

とゆーか、Processing/Processing.jsに変換しているだけなので、その文法とほぼ同じです。