Вопрос о создании записи, как в Mathematica, обсуждался в нескольких местах, например, тип данных Struct в Математика?.
Проблема со всеми этими методами заключается в том, что, по-видимому, теряется возможность выполнять конкретную дополнительную проверку каждого аргумента, например, когда выполняется 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, это настоящая запись, помогающая управлять и организовывать все переменные, используемые в программе.