バッファに含まれる文字数が10,000文字未満の場合、わずかに異なる計算が行われます。最初の計算で十分なため、このような処理は不要だと思うかもしれません。しかし、バッファが小さい場合、前者の手法ではカーソルが意図した行に正確に配置されないことがあり、後者の手法の方がより適切に動作します。
コードはこんな感じです:
(/ (+ 10 (* size (prefix-numeric-value arg))) 10)
これは、関数が括弧の中にどのように組み込まれているかを探ることで、何が起きているかを読み解くコードです。各式を、それを囲む式よりも深くインデントして整形し直すと、より読みやすくなります:
(/
(+ 10
(*
size
(prefix-numeric-value arg)))
10)
括弧を見ると、最も内側の演算は (prefix-numeric-value arg)
であり、生の引数を数値に変換しています。次の式では、この数値にバッファのアクセス可能な領域のサイズが乗算されます:
(* size (prefix-numeric-value arg))
この乗算により、バッファのサイズを超える可能性のある数値が生成されます(例えば、引数が7の場合は7倍になります)。次にこの数値に10を加算し、最後にその大きな数値を10で割ることで、バッファ内のパーセント位置よりも1文字分大きい値が得られます。
これらすべてを経て得られた数値がgoto-charに渡され、カーソルがその地点に移動します。