Вопрос о создании записи, подобной записи в системе Mathematica, обсуждался в нескольких местах, таких как Struct data type in Mathematica?.
Проблема со всеми этими методами заключается в том, что теряется способность, кажется, делать
специфическая дополнительная проверка каждого аргумента, как в случае x_?NumericQ
.
Мой вопрос заключается в следующем: есть ли в системе Mathematica способ сделать запись или структуру, и при этом иметь возможность использовать проверку, как описано выше, на отдельных элементах?
Я пытаюсь остановиться на одном методе для использования, так как я устал от того, что функции вызываются с 10 параметрами (иногда этого нельзя избежать), даже когда я пытаюсь сделать каждую функцию очень специфичной, чтобы минимизировать количество параметров, некоторым функциям просто нужно много параметров для выполнения специфической работы.
Сначала я покажу три метода, о которых я знаю.
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]
Clear[p,foo];
foo[p_]:=Module[{},
Print[p];
Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"] = Pi;
foo[p]
Преимущество: также безопасно, строки неизменны. Не стоит беспокоиться об изменении значения "from". Но иметь везде строки не слишком читабельно?
Clear[p,to,from];
foo[p_]:=Module[{},
Plot[Sin[x],{x,p[from],p[to]}]
]
p[from] = -Pi;
p[to] = Pi;
foo[p]
Недостаток: если где-нибудь перезапишется какой-нибудь символ 'from' или 'to', то возникнет проблема, как в
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, которая является настоящей записью, помогающей управлять и организовывать все переменные, используемые в программе.