Почему это использование Begin [] не работает? - PullRequest
12 голосов
/ 27 октября 2011

Если мы оценим эти строки по-одному , x будет создано в контексте cc.

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

Однако, если мы оценим их вместе,

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

, тогда x будет создан в Global. Это несмотря на следующую печать cc`:

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

В чем причина такого поведения? Я предполагаю, что контексты имеют значение только на этапе синтаксического анализа, а не оценки.

Вариант использования: я хотел создать палитру Button, которая будет определять некоторые символы, если они еще не существуют, в "частном" контексте, чтобы избежать конфликта с глобальными переменными. Какой предпочтительный способ сделать это , кроме помещения всех определений в файл пакета и загрузки их из палитры? (Я хотел бы сохранить палитру автономной.)

Ответы [ 3 ]

15 голосов
/ 27 октября 2011

Символы (и их контексты) создаются при разборе, а не при оценке.Если мы используем $NewSymbol, мы можем увидеть это в действительности:

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

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

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

Первый выводит:

first
Name: test1 Context: Global`
last

, потому что каждая строка в ячейке обрабатывается как отдельный вход.Вторая использует круглые скобки, чтобы все три строки считались одним входом, и печатает

Name: test2 Context: Global`
first
last

, из которого мы можем видеть, что test2 был создан в контексте Global` до того, как произошла какая-либо оценка.*

Я думаю, что самый простой способ работать с этим - использовать явный контекст для вашего символа: cc`x = 1.

2 голосов
/ 27 октября 2011

На ваш второй вопрос я отсылаю вас к этому моему ответу, который эффективно автоматизирует описанные вами шаги (с помощью функции ParseTimeNameSpaceWrapper). Возможно, потребуется больше работы, чтобы сделать его более надежным, но это может стать отправной точкой. Я использую этот материал сам по случаю.

0 голосов
/ 23 июля 2012

Только для справки:

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

cc`x
1
...