Настройка "структуры" в системе Mathematica безопасно

Вопрос о создании записи, подобной записи в системе Mathematica, обсуждался в нескольких местах, таких как Struct data type in 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]

Преимущество: также безопасно, строки неизменны. Не стоит беспокоиться об изменении значения "from". Но иметь везде строки не слишком читабельно?

Метод 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' или '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, которая является настоящей записью, помогающей управлять и организовывать все переменные, используемые в программе.

5
задан Community 23 May 2017 в 11:54
поделиться