2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 [Wolfram Mathematica] Связывание локальной переменной
Сообщение11.03.2018, 01:28 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Рассмотрим код:
Код:
Module[{x, f, d}, d = x + 2; f[x_] = d; DownValues[f]]

Переменные x и d локальные, вводятся для нужд определения f и в принципе могут быть омонимичны внешним переменным.
В приведённом коде переменная x в аргументе отлична от x, которая упоминается в d.
Можно ли, не меняя структуру кода, сделать динамическое связывание?

 Профиль  
                  
 
 Re: [Wolfram Mathematica] Связывание локальной переменной
Сообщение11.03.2018, 08:57 
Заслуженный участник


25/02/11
1786
Динамическое связывание чего? DynamicModule и InheritScope -> True случаем не то?

 Профиль  
                  
 
 Re: [Wolfram Mathematica] Связывание локальной переменной
Сообщение11.03.2018, 12:24 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Вопрос не касается динамического обновления значения, как в Dynamic.
Объясню в сравнении.

В нижеприведённом коде функция будет определена как линейная, переменная x в аргуренте будет связана с x в d.
Код:
d = x + 2;
f[x_] = d;
DownValues[f]

Если же этот фокус проделать внутри Module[{x}, ...], переменная в аргументе не будет совпадать с переменной внутри d.
Я не до конца понимаю, почему WM так себя ведёт.
Как достичь того же динамического связывания?

Обрисую задачу:
работаю символьно с выражениями, в некоторый момент формирую функцию. Этот участок кода хочу представить в виде функции, которая определённым внутренним параметрам сопоставляет это функцию. При этом я хочу замкнуть как можно больше символов, чтобы не произошло конфликта имён. Так, если вдруг x будет определена в каком-то другом месте программы, символьные вычисления (в d) произойдут неправильно и получится неправильная функция.
Вот код, чтобы понять контекст задачи
Код:
h[e_] := Module[{d, f},
   d = x + e;
   f[x_?NumericQ] = d;
   f
   ];

(* с этого места переменные x и e никак не связаны с одноимёнными внутри h *)
x = 1;
e := x + 1;
DownValues[Evaluate[h[e]]]
(* Будет: HoldPattern[f$709[x$_?NumericQ]] :> 3 *)
(* Должно быть: HoldPattern[f$709[x$_?NumericQ]] :> x$ + 2 *)

 Профиль  
                  
 
 Re: [Wolfram Mathematica] Связывание локальной переменной
Сообщение11.03.2018, 14:15 
Заслуженный участник


25/02/11
1786
Если в первом варианте сначала присвоить x=1, получится то же самое. Поэтому надо бы использовать локальную переменную.

Вот так работает:
Код:
x = 1;
h[e_] := Module[{d, f, x},
   d = x + e;
   f[(x /. x -> x) _?NumericQ] =d;
   f];
e := x + 1;
DownValues[Evaluate[h[e]]]
(*{HoldPattern[f$630(x$630 _?NumericQ)]:>x$630+2}*)

 Профиль  
                  
 
 Re: [Wolfram Mathematica] Связывание локальной переменной
Сообщение11.03.2018, 14:23 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Действительно, работает. Спасибо большое.
Но почему?!

 Профиль  
                  
 
 Re: [Wolfram Mathematica] Связывание локальной переменной
Сообщение11.03.2018, 15:59 
Заслуженный участник


25/02/11
1786
Не знаю. Судя по ответу, при определении функции с шаблоном модуль использует переменную x$ вместо $xnnn в аргументе. При подстановке x /. x -> x же вставляет текущее значение $xnnn.

Можно еще так:
Код:
x = 1;
h[e_] := Module[{d, f, x = x$}, d = x + e;
   f[x _?NumericQ] = d;
   f];
e := x + 1;
DownValues[Evaluate[h[e]]]
(*{HoldPattern[f$305(x$ _?NumericQ)]:>x$+2}*)

Но надо, чтобы локальная переменная $x, с помощью которой задаются функции, не менялась в модуле, а также не использовалась глобально.

 Профиль  
                  
 
 Re: [Wolfram Mathematica] Связывание локальной переменной
Сообщение11.03.2018, 16:54 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Vince Diesel в сообщении #1296752 писал(а):
Можно еще так:
Код:
x = 1;
h[e_] := Module[{d, f, x = x$}, d = x + e;
   f[x _?NumericQ] = d;
   f];
e := x + 1;
DownValues[Evaluate[h[e]]]
(*{HoldPattern[f$305(x$ _?NumericQ)]:>x$+2}*)
Опасно. Здесь по сути происходит манипуляция внутренним представлением, а именно, что аргумент всегда именуется добавлением $ в конец символа.

(Оффтоп)

Впервые вижу тег notex. Спасибо за подсказку.

Vince Diesel в сообщении #1296752 писал(а):
Но надо, чтобы локальная переменная $x, с помощью которой задаются функции, не менялась в модуле, а также не использовалась глобально.
Вполне разумное предположение.
Vince Diesel в сообщении #1296752 писал(а):
Не знаю. Судя по ответу, при определении функции с шаблоном модуль использует переменную x$ вместо x$nnn в аргументе. При подстановке x /. x -> x же вставляет текущее значение x$nnn.
Я не понимаю, как во фразе x /. x -> x заменяются символы. Верно ли, что это превращается в x$ /. x$ -> x$nnn?

 Профиль  
                  
 
 Re: [Wolfram Mathematica] Связывание локальной переменной
Сообщение11.03.2018, 17:57 
Заслуженный участник


25/02/11
1786
Видимо, да. Точно не знаю.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group