なぜこのBegin []の使い方は使えないのですか?

1つ1つという行を評価すると、 c というコンテキストで x が作成されます。

Begin["cc`"];
x = 1;
End[]

しかし、一緒に評価すると、

(Begin["cc`"];
x = 1;
End[])

xGlobal に作成されます。これは、次の cc の印刷にもかかわらずです。

(Begin["cc`"];
Print[$Context];
End[])

What is the reason for this behaviour? My guess is that contexts only matter during the parsing phase, not evaluation.

使用例:いくつかのシンボルが存在しない場合は、グローバルとの競合を避けるために「プライベート」コンテキストでいくつかのシンボルを定義するパレット Button を作成したかったのです。パッケージファイルにすべての定義を入れてパレットからロードする以外に、これを行うにはどのような方法が適していますか。 (私はパレットを自蔵しておきたいです。)

12
追加された 編集された
ビュー: 2
私はその文章を読んだだけです」「シンボル名の解釈は文脈に依存します。 Begin は入力式の構文解析に影響します。それは私の最初の質問に答えます。もう1つはまだ立っています。
追加された 著者 Szabolcs,

3 答え

シンボル(およびそのコンテキスト)は、解析ではなく評価時に作成されます。 $ NewSymbol を使用すると、これは実際にはわかります。

$NewSymbol=Print["Name: ",#1," Context: ",#2]&

Print["first"];
test1;
Print["last"]

(Print["first"];
 test2;
 Print["last"])

最初のものが印刷されます:

first
Name: test1 Context: Global`
last

セル内の各行が別々の入力として扱われるためです。 2つ目はカッコを使用して3行すべてを1つの入力とみなして印刷する

Name: test2 Context: Global`
first
last

評価が行われる前に test2Global` コンテキストで作成されていることがわかります。

私はこれで作業する最も簡単な方法は、あなたのシンボルに明示的なコンテキストを使うことです: cc`x = 1

15
追加された
@ Mr.Wizardは恐らくそうではないでしょう。 $ NewSymbol は、さらなる評価の間にそのシンボルに何が起こるかに影響しないからです。 @Andrewが言ったことと似たようなことをしていました。明示的なコンテキスト名を使うのが面倒になると、すべてを.mファイルに入れて読むことができます。パレットを自己完結型にする方法はおそらく、.mファイルの代わりに巨大な文字列を使用し、そこから読むことです。 パレットノートブックにコードを組み込み、パレットがロードされたときの定義を評価する信頼できるノートブック/フロントエンドウィザードがある場合を除き、
追加された 著者 Szabolcs,
@ Mr.Wizard私は別の質問に値すると思います。私はノートブックとフロントエンドで多くの経験がありません。
追加された 著者 Szabolcs,
Brett、 $ NewSymbol を使用して特定のコンテキストでシンボルを強制的に作成する方法はありますか?
追加された 著者 Mr.Wizard,
@アンドリュー、答えとして投稿してみませんか?
追加された 著者 Mr.Wizard,
@Szabolcs実際には、すでに尋ねられているが、決して解決されなかった。以下を参照してください:
追加された 著者 Mr.Wizard,
Brett、ありがとう、ありがとう。
追加された 著者 Mr.Wizard,
+1、面白い結果。
追加された 著者 rcollyer,
@ Mr.Wizard私は、 $ NewSymbol のドキュメントの例から、関数の出力が新しいシンボルを作成するために使われていないことを明らかにしていると思います。新しいシンボルは Null です)。
追加された 著者 Brett Champion,
ToExpressionを使用して、新しい解析( の評価中)を行うこともできます。(Begin ["cc`"]; [{s = ToExpression ["x"]}、s = 1 ]; 終わり[];)
追加された 著者 Andrew Moylan,

2番目の質問については、こちらの回答を参照してください。 ( ParseTimeNameSpaceWrapper 関数を使用して)概要を説明した手順を効果的に自動化します。より堅牢にするためにはもっと多くの作業が必要になるかもしれませんが、それが出発点になる可能性があります。私はこの材料を自分で時々使う。

2
追加された
ParseTimeNameSpaceWrapper [x] を実行すると、その x を実行しても、/code>は MyLocalizedContext`x ではなく、 Global`x として解釈されます。構文解析時にコンテキストが選択されたことを理解した後で、別の方法はないと思いますが、コードを文字列に入れて ToExpression を使うか、パッケージから読み込む(または、Brettが示唆しているようにコンテキストを明示的に記述していますが、これは長いコードでは多くの作業です)。
追加された 著者 Szabolcs,
@Szabolcs私は参照してください。多分、このスレッドは解析の段階に関してあなたにとって興味深いかもしれません: groups.google.com/group/comp.soft-sys.math.mathematica/…
追加された 著者 Leonid Shifrin,

ちょうど参考のために:

(Begin["cc`"]; Evaluate[Symbol["x"]] = 1; End[])

cc`x
  1
 
0
追加された