厳密な光線追跡 - その19 [光線追跡エンジンを作る]
前回はパッケージを作るためには知らないといけないコンテクストとは何か、ということをまとめた。今日はそのコンテクストを操作する方法について。
例えば
このように$Contextを書き換えるかわりにBegin[]とEnd[]を使うともとのコンテクストに戻ることができて、現行コンテクストの操作を入れ子にすることができる。
このあとに
Mathematicaの6.0以降のフロントエンドでは7番目の入力を評価した瞬間に、qwertyというシンボルが赤い文字に変わったはずである。これは$ContextPath上に複数の同じシンボルがあって、このままではGlobal`コンテクスト上のシンボルは隠されてしまう、とユーザに注意をうながすものである。
このあとに
ちなみにMathematicaのヘルプには面白い例が載っている。図-7はBegin[]とEnd[]を一行に書いている。
図-7 1行に書いたBegin[]とEnd[]
新しいシンボルxのコンテクストをプリントしているが、コンテクストは変更されていない。これはMathematicaの評価タイミングの問題で、セミコロンを使って一行に書くということは実はそれぞれがCompoundExpressionという関数の引数になっている、ということである。それは入力をFullFormでみればわかる。
こういう微妙な話はけっこう悩ましいバグを作ることにもなるので注意が必要である。
5.1.3 現行コンテクストの操作
現行コンテクストは直接$Contextを書き換えてもいいけど、もう少し便利な、Begin[]とEnd[]の組がある。新しいコンテクストをBegin[]の引数に指定するとそのコンテクストにうつり、End[]を呼ぶとその直前のコンテクストに戻る、と言う動作をする。例えば
In[1]:= Begin["Temp`"] Out[1]= Temp` In[2]:= qwerty=2 Out[2]= 2 In[3]:= End[] Out[3]= Temp` In[4]:= qwerty Out[4]= qwerty In[5]:= $ContextPath Out[5]= {PacletManager`,WebServices`,System`,Global`} In[6]:= Temp`qwerty Out[6]= 2最初の入力でTemp`コンテクストにうつって2番目でqwertyというシンボルを作っている。3番目でもとのコンテクスト(この場合立ち上げてすぐなのでGlobal`)に戻っている。4番目ではそのqwertyを入力すると無評価で帰ってきている。これは5番目のように$ContextPathにTemp`コンテクストがないからで、これは新しいシンボルとしてGlobal`コンテクストの上に作られたことになる。6番目の入力でフルネームを入れると、設定した値が返ってきている。
このように$Contextを書き換えるかわりにBegin[]とEnd[]を使うともとのコンテクストに戻ることができて、現行コンテクストの操作を入れ子にすることができる。
このあとに
In[7]:= $ContextPath=Prepend[$ContextPath,"Temp`"] Out[7]= {Temp`,PacletManager`,WebServices`,System`,Global`} In[8]:= qwerty Out[8]= 2としてみる。コンテクスト検索の先頭にTemp`コンテクストを付け加えた。そうするとqwertyシンボルはTemp`コンテクスト上のシンボルが評価されることになる。
Mathematicaの6.0以降のフロントエンドでは7番目の入力を評価した瞬間に、qwertyというシンボルが赤い文字に変わったはずである。これは$ContextPath上に複数の同じシンボルがあって、このままではGlobal`コンテクスト上のシンボルは隠されてしまう、とユーザに注意をうながすものである。
このあとに
In[9]:= $ContextPath=Rest[$ContextPath] Out[9]= {PacletManager`,WebServices`,System`,Global`} In[10]:= qwerty Out[10]= qwertyとすると先頭のTemp`コンテクストは検索からはずれて、フロントエンドの文字は青(デフォルトの場合)に変わってまた無評価にもどる。これはGlobal`コンテクスト上のシンボルが評価された、ということである。
ちなみにMathematicaのヘルプには面白い例が載っている。図-7はBegin[]とEnd[]を一行に書いている。
In[20]:= FullForm[Hold[Begin["a`"];Print[Context[x]];End[]]] Out[20]//FullForm= Hold[CompoundExpression[Begin["a`"],Print[Context[x]],End[]]]Mathematicaは式を評価するために、入力文字列を内部形式に変換する。その時点でシンボルのコンテクスト検索は解決してしまっている。つまり、図のシンボルxのコンテクストはこの一行が入力された時点でGlobal`が検索されて確定してしまって、そのあとに、Begin[]が評価されてコンテクストが変更されることになる。したがってxのコンテクストには影響が無くなってしまう。
こういう微妙な話はけっこう悩ましいバグを作ることにもなるので注意が必要である。
2012-12-23 21:02
nice!(0)
コメント(0)
トラックバック(0)
コメント 0