beginning-of-buffer 内の式 if は、バッファのサイズが 10,000 文字を超えているかどうかを判定します。そのために、> 関数と、let 式から得られる size
の計算を利用しています。
かつては buffer-size
関数が使用されていました。この関数は複数回呼び出されるだけでなく、アクセス可能な部分ではなく、バッファ全体のサイズを返していました。アクセス可能な部分のみを扱うようにすれば、計算ははるかに理にかなったものになります。(アクセス可能な部分に着目する方法の詳細については、狭小化と広域化を参照してください。)
行はこんな感じです:
(if (> size 10000)
バッファが大きい場合、if 式の then
部分が評価されます。その内容は以下の通りです(読みやすく整形しています):
(* (prefix-numeric-value arg) (/ size 10))
この式は乗算であり、関数 * に2つの引数が渡されています。
第1引数は (prefix-numeric-value arg) です。interactive の引数として "P" が使われる場合、関数に引数として渡される値は、数値ではなく生のプレフィックス引数として渡されます。(リスト内の数値です。)演算を行うには変換が必要であり、prefix-numeric-value がその役割を果たします。
第2引数は (/ size 10)
です。この式は、数値を10で割ります—つまり、バッファのアクセス可能な領域のサイズの数値を割るということです。これにより、バッファサイズの10分の1が何文字分に相当するかを示す数値が得られます。(Lispでは、* が乗算に使われるのと同様に、除算には /
が使われます。)
乗算式全体では、この値に接頭辞引数の値が掛けられます。乗算は次のようになります。
(* numeric-value-of-prefix-arg number-of-characters-in-one-tenth-of-the-accessible-buffer)
例えば、接頭辞引数が ‘7’ の場合、10分の1の値に7を乗じて、全体の70%の位置を求めます。
これらすべてにより、バッファのアクセス可能な領域が大きい場合、goto-char
式は次のように読み込まれます。
(goto-char (* (prefix-numeric-value arg)
(/ size 10)))
これでカーソルを希望の位置に配置できます。