Mathematica モジュールと With またはブロック - 使用に関するガイドライン、経験則? 質問する

Mathematica モジュールと With またはブロック - 使用に関するガイドライン、経験則? 質問する

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]後にのみ評価される を返します。これはの内部が正弦関数ではなく単なるシンボルだからです。次のようにすることもできます。BlockSinBlock

Block[{Sin = Cos[#/4] &}, Sin[Pi]]
(*
-> 1/Sqrt[2]
*)

(Traceどのように動作するかを確認するには を使用します)。したがって、 を使用すると、Block組み込み関数をローカルに再定義することもできます。

Block[{Plus = Times}, 3 + 2]
(*
-> 6
*)

おすすめ記事