Повторное использование локальной переменной в декларации внутри С


2

Учитывая богатство Mathematica.SE, я совершенно удивлен, что не смог найти ответ ... Мне очень жаль, если это дубликат.

Рассмотрим следующий пример:

With[{t1=0,t2=t1},t1+t2] (* -> t1 *) 

Я думал, что это будет печатать 0 вместо t1.

Действительно, Trace дает:

[email protected][{t1 = 0, t2 = t1}, t1 + t2] 
(* {With[{t1=0,t2=t1},t1+t2],0+t1,t1} *) 

t1 остается невычисленным.

Учитывая комплексное использование удержания и таких атрибутов для начинающих Mathematica, как я и documentation, что государства With имеет атрибут HoldAll, я попытался вставить Evaluate в разных местах, а также попытался заменить With на Module (я признаю разницу между With и Module мне не очевиден), но ничего не напечатал меня 0 вместо t1.

Как я могу сообщить Mathematica оценить t2=t1 с t1 и t2 объявлены в With?

Редактировать: Благодаря первым комментариям и ответам, некоторые полезные и близкие вопросы и ответы можно найти here.

  0

Есть действительно хорошие объяснения лексического и динамической области видимости [здесь] (http://stackoverflow.com/questions/6236458/plot-using-with-versus-plot -using-block-mathematica/6236808 # 6236808) и [здесь] (http://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs). В вашем примере вы можете вставить два '' '' '' '' '' '' '' '' '' '' '' '' если вы не хотите пытаться 'Block':' With [{t1 = 0}, With [{t2 = t1}, (t1 + t2)]] ' 27 авг. 132013-08-27 10:21:27

  0

Это хорошо известно. Так работает Mathematica. Ничего нового. Попробуйте 'Module [{x = 0, y = x}, Print [y]]' и он напечатает 'x', а не' 0'. Mathematica не обновляет параметры 'на лету'. Следовательно, он не использует только что обновленное значение. Так оно и было. 27 авг. 132013-08-27 10:24:03

+1

Правило большого пальца, которое я использую, чтобы я не делал ошибку, как это (думая, что я установил некоторую переменную в какое-то значение, но это не так), никогда не использовать 'p1 = p2' вообще в локальных переменных список. Если вы должны установить 'p2' в' p1', сделайте это после списка параметров, здесь -> 'Module [{p1 = 0, p2}, p2 = p1 ....]' Вам просто нужно запомнить это. 27 авг. 132013-08-27 10:37:44

  0

@SimonWoods это не совсем тот же вопрос, что и некоторые люди должны знать ответ этого: «Гнездо вашего' С'', прежде чем читать это * очень интересно * q/a, о котором вы говорите. Фактически, я просто читал это во время комментирования. 27 авг. 132013-08-27 13:14:52

  0

@Nasser Спасибо, я буду использовать ваш совет как можно скорее. Разве вы не думаете, что стоит поставить его в качестве ответа, чтобы я мог закрыть вопрос? 27 авг. 132013-08-27 13:17:51

2

LetL делать именно то, что вы хотите. Вы можете увидеть его реализацию here.

LetL[{t1 = 0, t2 = t1}, t1 + t2] 
  0

Как использовать 'LetL' для' With' и 'Module'? 'Module [{LetL [{a = 1, b = a + 1, c = a + b + 2}, {a, b, c}]}, Print [a]; ] 'не работает, и' Module [LetL [{a = 1, b = a + 1, c = a + b + 2}, {a, b, c}], Print [a]; ] 'не работает. Существует ли другой синтаксис?Вопрос заключается в том, чтобы использовать это в контексте 'With' и' Module', поэтому я предполагаю, что это можно сделать, я просто не могу понять синтаксис :) 27 авг. 132013-08-27 12:19:13

  0

@Nasser, какие атрибуты 'Module' ? Там лежит лживый ответ. :П 27 авг. 132013-08-27 13:27:36