Въпросът за създаване на запис като в Mathematica е обсъждан на няколко места, като например Struct тип данни в Mathematica?.
Проблемът с всички тези методи е, че човек губи способността, изглежда, да прави специфичната допълнителна проверка на всеки аргумент, както когато прави x_?NumericQ
.
Въпросът ми е: Има ли начин в Mathematica да направя запис или структура и все пак да мога да използвам проверката, както по-горе, за отделните елементи?
Опитвам се да се спра на един метод, който да използвам, тъй като ми омръзна функциите да се извикват с 10 параметъра върху тях (понякога човек не може да избегне това), дори когато се опитвам да направя всяка функция много специфична, за да минимизирам броя на параметри, някои функции просто се нуждаят от много параметри, за да свършат конкретната работа.
Първо показвам трите метода, за които знам.
Метод 1
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
foo[p]
Предимство: безопасно, тъй като ако променя символа "от" на нещо друго, пак ще работи. Като следния пример.
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
from=-1; (* By accident the symbol from was set somewhere. It will work*)
foo[p]
Метод 2
Clear[p,foo];
foo[p_]:=Module[{},
Print[p];
Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"] = Pi;
foo[p]
Предимство: също безопасно, низовете са неизменни. Не е нужно да се притеснявате за промяна на стойността "от". Но наличието на низове навсякъде не е твърде четливо?
Метод 3
Clear[p,to,from];
foo[p_]:=Module[{},
Plot[Sin[x],{x,p[from],p[to]}]
]
p[from] = -Pi;
p[to] = Pi;
foo[p]
Недостатък: ако някой от символите „от“ или „до“ бъде презаписан някъде, това ще причини проблем, както в
from=-4; (*accidentally the symbol from is assigned a value*)
foo[p]
Така. Мисля, че метод (1) е най-безопасният. Но сега губя способността да правя това:
foo[from_?NumericQ, to_?NumericQ] := Module[{},
Plot[Sin[x], {x, from, to}]
]
from = -Pi; to = Pi;
foo[from, to]
И така, надявам се да получа идея как да мога да комбинирам правенето на „запис“, но в същото време да мога да използвам проверката на параметрите на отделни елементи в записа? Или този въпрос не е добре поставен за функционален/базиран на правила стил на програмиране на Mathematica?
Това е нещо, което бих искал Mathematica да има, което е истински запис, който да помогне за управлението и организирането на всички променливи, използвани в програмата.