Sassで角度の単位を変換する関数を書いてた。

$PI: 3.141592653589793;

@function convert-angle($angle, $to-unit) {
    $from-unit: unit($angle);
    $from-value: strip-unit($angle);
    $factors: (
        rad: 1,
        deg: 180 / $PI,
        grad: 200 / $PI,
        turn: 0.5 / $PI
    );

    @if not map-has-key($factors, $from-unit) {
        @warn '`#{$angle}` is not an <angle>.';
        @return false;
    }

    @if not map-has-key($factors, $to-unit) {
        @warn '`#{$to-unit}` is not a valid <angle> unit.';
        @return false;
    }

    $rad-value: $from-value / map-get($factors, $from-unit);
    @return $rad-value * map-get($factors, $to-unit) + $to-unit;
}

@function strip-unit ($number) {
    @if unitless($number) {
        @return $number;
    } @else {
        @return $number / ($number * 0 + 1);
    }
}

単位を取り除いた上でいったんrad単位の値に変換し、さらにそこから指定の単位に変換する、という実装。

でも実は、知らなかったんだけど、Sassはネイティブで単位の異なる角度の演算ができる。

@debug 180deg + 0.25turn + 100grad; // 360deg

演算結果は最初に登場した単位になる。これを応用して、値が0の角度を使えば単位の変換はごく簡単にできる。たとえばdegからradへ変換するにはこう。

@debug 0rad + 180deg; // 3.14159rad

つまり冒頭の関数はまったく不要。どうやら4年前のSass 3.4からの話のようで、<angle>と同じように<time>、<frequency>、<resolution>も単位の異なる演算ができる。半日無駄にした。