i realized that i overlooked the new $iptype() and its useful properties. here's a version of the above snippet that should be marginally quicker in light of these changes:

Code:

alias longipv6 {
  if ($1-. isnum) {
    if ($1 >= 0) {
      var %num = $1, %i = 8, %out
      while (%i) {
        bunset &quot
        bset &quot 50 0
        while ($left(%num, 15) > 65535) {
          var %div = $int($calc($v1 / 65536)), %rem = $v1 % 65536
          bset -t &quot $calc(51 - $mid(%num, 16, 0) - $len(%div)) %div
          %num = %rem $+ $mid(%num, 16)
        }
        %out = $instok(%out, $base(0 $+ $v1, 10, 16), 1, 58)
        !breplace &quot 0 48
        %num = $regsubex($bvar(&quot, 1-).text, /^0*/, )
        dec %i
      }
      return $lower($iptype(%out).compress)
    }
  }
  elseif ($iptype($1-) == ipv6) {
    var %n = $iptype($1).expand, %i = 8, %out, $&
      %3 = 281474976710656, $&
      %4 = 18446744073709551616, $&
      %5 = 1208925819614629174706176, $&
      %6 = 79228162514264337593543950336, $&
      %7 = 5192296858534827628530496329220096
    while (%i) {
      var %num = $base($gettok(%n, %i, 58), 16, 10), %pow = 8 - %i
      if (%pow < 3) {
        inc %out $calc(%num * 65536 ^ %pow)
      }
      elseif (%num) {
        var %pow = $eval(% $+ %pow, 2), %carry, %result
        while ($right(%pow, 10)) {
          var %mul = $v1 * %num, %result = $base($calc($right(%mul, 10) + %carry), 10, 10, 10) $&
            $+ %result, %carry = $left(%mul, -10), %pow = $left(%pow, -10)
        }
        var %result = %carry $+ %result, %carry, %num
        while (%out $+ %result) {
          var %add = $calc($right(%result, 15) + $right(%out, 15)), $&
            %num = $base($calc($right(%add, 15) + %carry), 10, 10, 15) $+ %num, $&
            %carry = $left(%add, -15), %out = $left(%out, -15), %result = $left(%result, -15)
        }
        %out = %carry $+ %num
      }
      dec %i
    }
    return $regsubex(%out, /^0*+\B/, )
  }
}