Temat: Problemy z ReplacePart

Probuje wykonac taka sekwencje:

 
t2 = Select[Table[i, {i, 1, 40}], OddQ];
ReplacePart[t2, i_ -> (1 + t2[[i]])/2]

ma to utworzyc tablice 40 liczb, wybrac z niej tylko parzyste i nastepnie przetransformowac je wg zadanego wzoru.  Mathematica generuje co prawda poprawny wynik ale razem z warningiem:

Part::pspec: Part specification i is neither an integer nor a list of integers. >>
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}

2

Odp: Problemy z ReplacePart

Rozwiązaniem problemu jest użycie RuleDelayed, czyli

t2 = Select[Table[i, {i, 1, 40}], OddQ];
ReplacePart[t2, i_ :> (1 + t2[[i]])/2]

Różnica polega na kolejności obliczania prawej strony zastąpienia.

Rule (i_->t2[[ i ]]) zwraca błąd ponieważ prawa strona jest obliczana dla i=i.
RuleDelayed (i_:>t2[[ i ]]) nie oblicza prawej strony. Różnica jest analogiczna jak dla Set (=) i SetDelayed (:=), w manualu Mathematici jest to szczegółowo opisane.