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, Супермодераторы



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

Сейчас этот форум просматривают: gris


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

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