Ошибка генерации локализованных переменных (как констант)
Сообщение об использовании дляSet
напоминает нам, что несколько назначений могут быть легко сделаны в двух списках, без необходимости что-либо разрывать. Например:
Remove[x1, x2, y1, y2, z1, z2];
{x1, x2} = {a, b}
Выполняет присваивание и возвращает:
{a, b}
Thread
, обычно используемый для генерации списков правил, также может быть вызван явно для достижения того же результата:
Thread[{y1, y2} = {a, b}]
Thread[{z1, z2} -> {a, b}]
дает:
{a, b}
{z1 -> a, z2 -> b}
Однако использование этого подхода для генерации локализованных констант приводит к ошибке. Рассмотрим этот тривиальный пример функции:
Remove[f];
f[x_] :=
With[{{x1, x2} = {a, b}},
x + x1 + x2
]
f[z]
Вот сообщение об ошибке:
With::lvset: "Local variable specification {{x1,x2}={a,b}} contains
{x1,x2}={a,b}, which is an assignment to {x1,x2}; only assignments
to symbols are allowed."
Документация с сообщением об ошибке (ref/message/With/lvw
), в разделе «Дополнительная информация» говорится, что «Это сообщение генерируется, когда первый элемент в С не является списком назначений для символов«Учитывая это объяснение, я понимаю механику того, почему мое назначение провалилось. Тем не менее, я озадачен и задаюсь вопросом, является ли это необходимым ограничением WRI или небольшим надзором за дизайном, о котором следует сообщить.
Итак, вот мой вопрос:
Может ли кто-нибудь пролить свет на это поведение и / или предложить обходной путь? Я экспериментировал с попыткой заставитьEvaluation
без удачи, и я не уверен, что еще попробовать.