Swiff 基礎文法最速マスター

Swiff とは?

Swiff とは、プログラミング言語の名前です。 Swiff を日本語にすると、えーっと何かの擬音なのは覚えてるんだけど、忘れました。
名前の由来は Apple が発表した Swift 言語をおちょくったニュアンスで、名前空間をもう少し大事にしてほしいなという気持ちと
願わくば Swift を押しのけて有名になってほしいなという気持ちで命名しました。

Swiff のインストール

Swiff は架空の言語です。
つまり、処理系が無い幻の言語ということです。

Swiff のプログラム実行

Swiff プログラムを実行するためには 2 つの方法があります。

  • コンパイラ(swiffc)で実行可能バイナリを生成し、それを実行する。
  • インタプリタ(swiff)を使う。
  • REPL(swiff -i)でりーど・いばる・ぷりんと・るーぷをぐりぐり回す。

ありゃ、 3 つですね。 それぞれについて説明します。

swiffc の使い方

swiffc は Swiff のソースコードから実行可能バイナリを生成します。
実際には C 言語のソースコードを生成し、gcc などでネイティブな実行可能バイナリを生成しています。
swiffc -t で C 言語のソースコードを生成することも出来ます。

Swiff は特定のエントリポイントの要らないプログラム言語です。 ですから、main 関数が必要ありません。

println "Hello, World!"

この様にトップレベルに書くだけで実行されます。

コンパイルはこの様に行います:

% swiffc ./hello.swiff

なお、ソースコード拡張子は swiff にしておこうかなと思います。
実行可能バイナリを実行する場合は:

% ./hello

と打ちます。

swiff の使い方

swiff は Swiff VM 上で Swiff のソースコードを実行します。

#!/usr/bin/swiff

println "Hello, World!"

shebang を付けてコマンドのように実行することもできます。

% chmod +x ./hello.swiff
% ./hello.swiff
Hello, World!

swiff -i の使い方

swiff -i または swiff --interactive は Swiff VM を対話的実行環境で動かします。

% swiff -i
swiff> 12 + 12
24
swiff> println "Hello, World!"
Hello, World!
swiff> exit

基礎

それでは文法の方に移りましょう。
Swiff のソースコードは以下のような見た目をしています:

void main() {
    let condition = false;
    
    until ( condition ) {
        if ( hoge() > 0 ) {
            condition = true;
        }
    }
}

Swiff は ALGOL 型波括弧系言語である C 言語に限りなく近い構文を採用しています。

コメント

コメントは C++ 言語で使えるコメントと同じです。

// 一行コメント

/*
   複数
   行
   コメン
     ト
 */

端末への出力

今まで何回か出てきましたが、println は与えられた値を端末*1に出力して改行する関数です。

println 42

改行しない print もあります。
以下のコードはどちらも Hello, World! を出力し、その後改行します:

print "Hello, World!\n"
println "Hello, World!"

値をフォーマットして出力してくれる printf もあります。

変数の宣言

ローカル変数は let で宣言します。 ここが C 言語の構文と異なるところです。

let foo : int = 42
let baz = 3.14

let で宣言した変数は mutable(変更可能)です。

let foo : int = 42
foo = 1782

immutable (変更不可)な定数を宣言する場合は val を使います。

val quz : int = 42

値を変更しようとすると、シンタックスエラーとなります。

どちらの場合も型推論されるので、型を省略することも可能です。

let foo = 42
let baz = 3.14
val quz = new object()

C と Swiff の大きな違いとして、C では「文」として扱われるものが、Swiff では「式」として扱われます。
例えば、画面の幅より外に表示オブジェクトが存在した場合、自動的に画面の枠内に移動させたいというような場合には C 言語話者ならばこの様に書くでしょう:

let position_x : int = tmp_x;

if ( 0 >= tmp_x ) {
    position_x = 0
} else if ( tmp_x < screen_width ) {
    position_x = screen_width
}

Swiff なら、if は文ではなく式なので position_x = ~~~~ というような代入文の繰り返しを省略してこの様に書けます:

let position_x : int = if ( 0 >= tmp_x ) {
    0
} else if ( tmp_x < screen_width ) {
    screen_width
} else {
    tmp_x
}

Lisp*2 でこう書くのと同じです:

(define position-x (cond ((>= 0 tmp-x)           0)
                         ((< tmp-x screen-width) screen-width)
                         (:else                  tmp-x)))

if だけではなく、ブロックも式なのでこんな風にも書くことができます:

let frame = {
    let position = new Point( rect.width / 2.0f, rect.height / 2.0f )
    let size = new Size( 300, 500 )
    
    new Rectangle( position, size )
}

基本的な型

真偽値型 (bool)

truefalse の 2 つの値のみをとれる型です。
以下のオペレータが定義されています:

true && false    // => false
true || false    // => true
!true            // => false

C 言語などと同じ様に &&|| は短絡評価です。

数値

言語組み込みの数値型には大きく分けて「整数」、「浮動小数点数」、「十進数」の 3 種類があります。 整数型は細かい種類の型に分けることができます。

(l ω l〃) うぐぅ…、フラットに表示されてる…

*1:もっというと標準出力

*2:Scheme 的な意味で