Leonid は著書の第 4 章で次のように書いています。「... Module、Block、および With。これらの構成要素は、Mathematica Book および Mathematica Help で詳しく説明されているので、ここではそれらについて簡単に説明します...」
私が読んだ(見つけた)ものからすると、まだよくわかりません。パッケージ化された関数の場合、私は(単に)Moduleを使用します。これは機能し、構造もわかっているからです。ただし、これが最善の選択ではないかもしれません。With(またはBlock)をいつ、どこで、なぜ使用するのかは、(ドキュメントから)私には完全にはわかりません。
質問。Module、With、Block (パッケージ内の関数用) をいつ使用するかについての経験則やガイドラインはありますか? Module と比べて制限はありますか? ドキュメントには With の方が高速であると書かれています。Module (または別の構成要素) の =choice= を守れるようにしたいです。
ベストアンサー1
Block
とのより実際的な違いは、Module
次のようになります。
Module[{x}, x]
Block[{x}, x]
(*
-> x$1979
x
*)
したがって、例えば を返したい場合はx
を使用できますBlock
。例えば、
Plot[D[Sin[x], x], {x, 0, 10}]
動作しません。動作させるには、
Plot[Block[{x}, D[Sin[x], x]], {x, 0, 10}]
(もちろんこれは理想的ではなく、単なる例です)。
もう 1 つの使用法は、 のようなものでBlock[{$RecursionLimit = 1000},...]
、一時的に を変更します$RecursionLimit
(Module
の名前を変更するため、機能しません$RecursionLimit
)。
Block
何かの評価をブロックするためにも使うことができます。例えば
Block[{Sin}, Sin[.5]] // Trace
(*
-> {Block[{Sin},Sin[0.5]],Sin[0.5],0.479426}
*)
つまり、 が実行を終えたSin[0.5]
後にのみ評価される を返します。これはの内部が正弦関数ではなく単なるシンボルだからです。次のようにすることもできます。Block
Sin
Block
Block[{Sin = Cos[#/4] &}, Sin[Pi]]
(*
-> 1/Sqrt[2]
*)
(Trace
どのように動作するかを確認するには を使用します)。したがって、 を使用すると、Block
組み込み関数をローカルに再定義することもできます。
Block[{Plus = Times}, 3 + 2]
(*
-> 6
*)