カーネルおじさんによる美味しくできるニワトリ料理パターン

www.adventar.org

╰( ´◔ ω ◔ `)╯ 毎回記事本体じゃなくて、ナンセンス釣りタイトルを考えるのに時間を費やしてる気がしなくもない

今朝は Swiff の型について考えたような気がする。
自分の中では Swiff も Uva も文法的なところが違うだけのようになってきたので、どんどこどーん!

Swiff は Swift や Rust、Kotlin をインスペクトしているので、let は変数宣言で、val は定数宣言になってる。

すごく簡単に書くとこんな感じ:

("let" | "val") <識別子> [":" <型ヒンティング>] "=" <値> ";"

val だった場合は、<値> 必須だとか色々あるけど、こんな風に変数または定数を定義する。
例を示すとこんな感じ:

let hoge = 42;
let piyo : string = "Cunky bacon!!";

val TeddyBearFee = 6000;

上記の例で val で宣言された識別子、ええっと、定数が UpperCamelCase で表記されていることに気がついた人もいるかもしれない。
そして、定数が UpperCamelCase でないとコンパイラがブーブー言うだろうと思った人は安心していい。
そんなことはない。

Wikipedia の Swift の記事において var*1 で宣言された識別子は定数と呼ばれていた。
でも、そうじゃなくて、変更できない変数あるいは束縛と呼ぶべきだったのだ。
典型的な関数型プログラミングの考え方では、私たちが変数と呼ばれているものは実は値に名前が書かれた札が紐で結ばれているだけで、 それは分かちがたく結びついているので変更できない。
このことを不変更性を持つと呼ぼう。
札から下がった紐が果てしなくこんがらがって絶対に解くことはできないのだ。

とはいえ、実用的なプログラミング言語にそのようなパズルみたいな難解な代物を持ち込むべきではないと今でも思っている人たちも大勢いるわけで、 彼らにも配慮してやらなければならない。

私としては不変更性はすごく重要だと思っているので Uva では普通に宣言した変数は不変更性を持つようになっている。
どうしても変更可能な変数を宣言したい場合は variable アノテーションをつければいい。

Swiff はカジュアルな言語を志向しているので、型ヒンティングは :(コロン)で識別子の後ろに付けることになる。
もちろん、そんな面倒なことをしなくても、型推論によってある程度変数の型はコンパイル時に決定される。
Uva でも型推論で同じように変数の型は決定されるけど、そうしたい旨をコンパイラに伝えないといけない。
それが auto キーワードだ。
Uva は Swiff の後置に対して前置タイプなので、型ヒンティングを必ず付ける必要が生じる*2
でも、Uva には静的型付き言語の顔をしてほしかったため、C++ から auto を取ってきた。

(。ŏ﹏ŏ) こうしてみると、Uva と Swiff って性格が違うんだね

╰( ´◔ ω ◔ `)╯ そうだな

更に、関数定義でも fun ではなく、def を採用した。

def is_nil(x : T?) : bool {
    match x {
        is T    => true,
        is Nil  => false
    }
}

あと、match 式 (・∀・)イイ!!
という感じだったので、switch は無し。

return もあるけど、基本的には最後の値が返されるという感じ。
後置 if とか 後置 unlesswhileuntil もあるよ。

let x = if x < Screen.width then x else Screen.width;   // :? タイプの if 式

let y = if y < Screen.height {
    y
} else {
    Screen.height
};                              // if っぽい if 式

if は式だし、then 節はかっこつけなくてもいいんじゃないかとかとかとか…………。

*1:Swift ではそれは val でなくて let なのだ

*2:variable で代用することもできるけど、不変更性を持つ変数の場合は? const を使いたくなかった