ぜのぜ

しりとりしようぜのぜのぜのぜ

94日目

日記

焼肉行きてぇ

今日書いたコード

infix operator **: MechakuchaTsuyoiPrecedence
precedencegroup MechakuchaTsuyoiPrecedence {
    higherThan: MultiplicationPrecedence
    associativity: left
}

import Foundation
extension Int {
    static func ** (left: Int, right: Int) -> Int {
        Int(pow(Double(left), Double(right)))
    }
}

print(4 ** 8 * 2, "=", Int(pow(4.0, 8.0)) * 2, "≠", Int(pow(4.0, 8.0 * 2.0)))
// 131072 = 131072 ≠ 4294967296

感想

昨日の節はOperator Methodというタイトルで,既存の演算子の挙動を定義できるという話だった.昨日の例のように独自の演算子を定義するのは今日のCustom Operatorの範疇だった.precedencegroupを指定しないなら昨日のように手数が少なく書けるということらしい. 訂正しました(2021/09/22)

ということで上記のようなコードが書ける.Precedenceというのは演算子の優先度で,例えば乗算は加算よりPrecedenceが高い.Associativityは同じPrecedence演算子が並んだときどちらから演算が行われるかを表すもので,例えば乗算は左向きのAssociativityを持つ.

上記以外に指定できる項目はPrecedence Group Declaration を参照.既存の演算子が属するprecedencegroupの一覧はOperator Declarations.