読者です 読者をやめる 読者になる 読者になる

Swiff 基礎文法最速マスター

架空言語 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 的な意味で