Go to the first, previous, next, last section, table of contents.


憑依モードにおける割付け

憑依モードにおいて特に便利なのが `:=' (割付け演算子)と `=>' ("evaluates-to"演算子)です。 これにより、ある式による定義をバッファ内の他の式で参照できるようになるのです。

次のような、変数に値を割付ける埋込み式(embedded formula)に憑依すると、

foo := 5

この式は、5foo にストアされた値として記録し 現行バッファの憑依モード演算用とします。 しかし実際には、foo の「グローバル」な値として 5 をストアするのではありません。 通常の Calc 演算や他バッファの憑依モードからは、 この値は見えません。

この割付け定義を参照する方法のひとつは、 どこかに foo を参照する埋込み式(embedded formula)を作って憑依し、 そこで = を打つことです。 しかし、これでは式の中の foo が永遠に置換えられてしまいます。 もっと面白いのは、`=>' を使う方法です。

foo + 7 => 12

`=>' の一般的な議論は、Evaluates-To 演算子 参照 。

foo の定義式に戻って割付けを変更すると、 それを参照する `=>' 式はどれもみな自動的に更新されます。

foo := 17

foo + 7 => 24

そこで当然湧き起る疑問は、Calc が憑依したままでどうやったら foo への割付けを変更できるのか?ということでしょう。 もしこの割付け定義式に憑依した状態で 17 をタイプすると、 割付け式全体が 17 に置換えられてしまいます。 他の式への影響を見ると、変数 foo が未定義になってしまっています。

17

foo + 7 => foo + 7

正しいやり方は、まずセレクションコマンドを使って (j 2 は手品ができます)、 定義式の右辺をセレクションする事です。 そして 17 TAB DEL と打つと右辺が 17 に置き換わります (この仕組みを知るには、サブ数式のセレクション 参照 )。

M-# j (calc-embedded-select) コマンドを使うと 割付け操作が簡単にできます。 M-# e に似ていますが、 憑依した式がもし割付け定義の場合は j 2 で右辺をセレクションします。 もし憑依した式が evaluates-to であれば、 j 1 で左辺をセレクションします。 両者が組合わされた式もあり得ます。

bar := foo + 3 => 20

この場合、M-# j を使うと真ん中の部分(`foo + 3')をセレクトします。

憑依モードを終了すると、セレクションも自動終了します。

foo への割付け定義を変更するもうひとつの方法は、 憑依モードでない通常の Emacs で数値を編集することです。 この場合は、その変更を憑依モードに知らせてやる方法を知っておかねばなりません。 M-# uM-# = (calc-embedded-update-formula) コマンドが それです。

foo := 6

foo + 7 => 13

M-# e = M-# e と打つと、Calc はカーソルが置かれた式に一時的に憑依して、 そして = で評価が実行されますが、M-# u はそれによく似ています。 しかし実際には、M-# uM-# e を使いません。 事実、M-# u を使っても、 どこか他の場所で起動されている憑依モードが妨げられることはありません。 (訳注: しかしカーソル位置は憑依登録されるらしい)

数値接頭引数を付けると、M-# u はバッファ内の全ての `=>' 式を更新します。 それまでに Calc が憑依したことがない式や、 `=>' を最上位演算子として含まない式は影響を受けません。 (これが便利なのは m C を使った場合だけです:後述)

空の C-u プリフィックスを付けて C-u M-# u とすると、 バッファ全体ではなくポイント・マーク間のリージョンのみ更新されます。

M-# u は、新規に書かれた `=>' 式をアクティブ化する、 手軽な方法でもあります。

M-# a (calc-embedded-activate) コマンドは、 現バッファ全体をスキャンして、`:='`=>' 記号を含む全ての埋込み式 (embedded formula)を アクティブ化します。これは憑依モードを起動するわけではなく、 ただ各式の位置を登録するだけです。これで、 割付け定義の変更とともに `=>' の値が適切に更新できるようになります。

`=>' 演算子が埋込まれたファイルを読込んだ直後に M-# a をタイプするのは良いアイディアです。 これを自動的に実行するために、 Emacs の「バッファローカル変数」機能が利用できます。 つまり、ファイルの末尾あたりに次のような数行を置くのです。

--- Local Variables: ---
--- eval:(calc-embedded-activate) ---
--- End: ---

ここで、前後の `---' は任意の文字列に置換えるか、省略できます (ただし3行とも同じでなくてはなりません)。 TeX ファイルでは、`%' で開始して後ろは不要です。 C プログラムでは、`/*'`*/' で挟むのが良いでしょう。

Emacs がファイルをメモリに読込んだとき、 ファイルの末尾にこのようなローカル変数セクション (Local Variables section)が無いかチェックします。 もし見つかれば、編集作業が開始される前に 指定事項(この場合はM-# a の自動実行)を実行します。 ローカル変数セクションを Emacs に発見させるための制限は、 ファイル末尾から3000文字以内に置くことと、 ファイルがページセパレータを含んでいるなら最終ページに置くことです。 See section `Local Variables in Files' in the Emacs manual.

注意: M-# a は見つけた式を更新しません。 更新するには M-# a の後に M-1 M-# u とします。 しかし、普通はファイルがセーブされたとき既に更新されているはずなので、 通常は問題にならないはずです。

通常、M-# a は見つけた式を全てアクティブ化しますが、 それ以前にアクティブだった式もその状態を続けます。 正の接頭引数を付けると、 まず現在アクティブな式を全て非アクティブにしてから、 次にバッファ内をスキャンし、そのとき見つけた式すべてをアクティブにします。 負の接頭引数を付けると、全てを非アクティブにするだけです。

憑依モードはメジャーモード名に続くシンボルとして `Active'`~Active' の 2つを持っています。 `Active' を示すのは、「バッファ内の全ての式がアクティブである」と 信じられるときで、例えば、M-# a を実行したのち非アクティブ化を強制される (これはあり得ることで、変数が変更されたので `=>' 式を更新しに行ってみたら、 憑依モード外の編集によって式が無くなっていた・・・ようなときに発生します) ことが無かった場合です。 モードラインに `~Active' を示すのは、 いくつかの、しかしおそらく全部ではない式がアクティブになっている場合です。 例えば、 式をひとつひとつアクティブ化してきたが一度も M-# a を実行してないとか、 M-# a を使ったものの、その後Calc が式を見失ったために非アクティブ化した ような場合です。 モードラインにどちらも表示されないのは、 バッファ内にアクティブ化された埋込み式がひとつも無い場合です (つまり、憑依モードになる前か、M-- M-# a のあとです)。

埋込み式は、バッファ内の割付け定義がどこにあっても、前でも後ろでも参照できます。 ひとつの変数に複数の定義が存在する場合、直前の定義があればそれを使い、 無ければ後方の定義を使います。

x => 1

x := 1

x => 1

x := 2

x => 2

単なる変数と同様に、添字つきの変数にも割付け定義ができます。 それは `var_number' (例えば x_0)や 、 `var_var' (例えば x_max)の形式の添字変数です。 その他の種類のオブジェクトへの割付け定義も Calc で表現できますが、 定義式と参照式の間の自動リンクが効くのは、 単純変数と上記2種類の添字変数だけです。

与えられた変数に(ローカルに)割付けられた定義が無ければ グローバルにストアされた値(変数のストア 参照 )を使用し、 それも無ければ、変数はシンボリックなまま残されます。 注意: グローバル・ストア値は、 ファイルがセーブ・再ロードされると失われてしまいます。 これを避けるには、 s p (calc-permanent-variable) コマンドを使ってセーブしておきます; その他の変数操作 参照 。

m C (calc-auto-recompute) コマンドは、 `=>' 式の自動再計算機能を On/Off します。 自動再計算が Off のときは、割付け定義を変更したら M-# u を使って手動で更新しなければなりません。 いくつかの割付け定義を一度に変更するときは、 m C とタイプしてから全ての割付け定義を変更し、 最後に M-1 M-# u としてバッファ全体を更新するのが能率的です。 m C コマンドはまた、スタック上の `=>' 式をコントロールします; Evaluates-To 演算子 参照 。 自動再計算を再開したとき、スタックは更新されますが、バッファは更新されません。 M-# u を使って手動で更新しなければなりません。


Go to the first, previous, next, last section, table of contents.     利用度数