🛒

条件演算子がない世界の苦しみ

に公開

https://github.com/golang/go/blob/7abeefd2b1a03932891e581f1f90656ffebebce4/src/runtime/malloc.go#L211

を見て

条件演算子も 値を返す if 文も コンパイル時計算が保証される関数も ない世界ではこうするしか無いよな、と思った。

適当にちょっと括弧を足して改行を挟むと下記の感じ。

go
heapAddrBits = (
    (
        _64bit
        *(1-goarch.IsWasm)
        *(1-goos.IsIos*goarch.IsArm64)
    )*48 
    + (
        (1-_64bit+goarch.IsWasm)
        *(32-(goarch.IsMips+goarch.IsMipsle))
    )
    + 40*goos.IsIos*goarch.IsArm64
)

パット見、何を言っているのか全然わからない。
これをみて wasm の時(32bit or 64bit)にどうなるかがすぐ分かる人は稀だと思う。

? : があれば各定数が論理型になって

go-with-cond-op
heapAddrBits = (
  goarch.IsMips || goarch.IsMipsle ? 31
  : goarch.IsWasm ? 32
  : goarch.IsArm64 && goos.isIos ? 40
  : _64bit ? 48
  : 32 )

ぐらいになる(自信ない)。

※ 元の式からはわからないけど、IsMips のときは _64bit にならないとか、そういうことが色々ある。

条件演算子(のようなもの)はわかりにくい式を作りやすいけど、条件演算子がないと分かりにくくしか書けない式をわかりやする能力もあるんだから、存在したほうがいいと思う。

Discussion