書いて覚えるSwift入門

第3回 演算子

この記事を読むのに必要な時間:およそ 3 分

演算子=へんな関数

連載第4回目の今回は,前回予告どおりSwiftにおける演算子(operators)を詳しくみていきます。

その前に,演算子とは一体なんでしょうか?

なんだか難しそうな定義がありそうな気がしますが,Perlの父,Larry Wallが単純にして明快な定義を示してくれています。

> operators are just funny looking function calls注1

「ただの変な見た目の関数呼び出し」。たしかに言われてみると,演算子がなくとも一人前な言語はいくらでもあります。とくによく知られているのはLisp でしょう。1 + 1ではなく(+1 1)と書けば事足りますし,3 + 2 * 4を計算したければ必ず(+ 3 (* 2 4))と書くので優先順位の問題もありません。

実際,「へんな関数」がないおかげでLisp の実装というのはずいぶんと楽で,Lisp in ほげほげでほげほげ言語を検索すると,誰かが手なぐさみに実装したLispがいくつも見つかりますし,簡単なものは大学の学部生の課題として取り上げられたりします(私はSchemeでSchemeを書かされました。もう20年前)。Swiftの母体ともなったLLVMがChris Lattnerの博士号の課題だったのと比べるとその難易度の差も感じられようというものです。

しかし,演算子がない言語は実装しやすい代わりに使いにくい。E = m * c ** 2と書ける言語と,(setq E (* m (** c))注2と書かねばならない言語では,やはり前者の方が人気者。CもC++もJavaもJavaScriptもPerlもPHPもPythonも,本誌が好んで取り上げる言語はほとんど演算子を持っています。

しかし演算子を再定義したり,ましてや新演算子を定義できたりする言語となると,格段に減ります。Swiftはその数少ない例外。C++のような演算子オーバーロードはもちろん,Haskellのような優先順位定義までサポートしています。これはやるっきゃないでしょう。

注1)
Apocalypse 3: Operators
注2)
ふつうのLispでは**は定義されていません。Schemeであれば(define (** x) (* x x))といったところでしょうか。

二項演算子

前口上はこれくらいにして,実際に使ってみましょう。前回は,

struct Point {
    var x:Int
    var y:Int
}

Printableにしたところで終わっていました。これをEquatableにしてみます。equatableということは,等号があるということ。つまり==を実装すればいいわけです。こういうふうに。

func ==(p:Point, q:Point)->Bool {
  return p.x == q.x && p.y == q.y
}

こんな簡単でいいのでしょうか?

いいみたいです図1)。

図1 二項演算子の実行結果

図1 二項演算子の実行結果

二項演算子(binary operators)の場合,普通の関数と同じように定義できてしまいます。関数名は,演算子そのもの。簡単ですね。

前置と後置の場合は?

二項演算子の場合,位置に曖昧さはないのでこれで十分なのですが,単項演算子(unary operators)の場合,前置(prefi x)と後置(postfi x)の2つが考えられます。たとえば++は前置と後置両方ありますよね。

前述のPoint++したいケースというのはあまり考えられないのですが,ここでは便宜上xyそれぞれ++するということにして,前置と後置を書き分けられるかを試してみることにしましょう。

前置のほうは簡単です。引数を上書きするので,inoutがついている点に注意してください。

prefix func ++(inout p:Point)->Point{
    p.x++; p.y++; return p
}

後置のほうはちょっと工夫がいります。返り値は++する前の値なので,前の値を一時変数に格納したうえでそれを返しています。

postfix func ++(inout p:Point)->Point {
    var q = p
    p.x++; p.y++; return q
}

それではうまくいくでしょうか。うまくいったみたいです図2)。引数がvarではなくletで宣言された定数の場合,きちんとエラーになっているところも含めて。

図2 前置と後置の実行結果

図2 前置と後置の実行結果

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。

コメント

コメントの記入