Сообщение об использовании 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}]
Gives:
{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
), в разделе 'More Information' говорится, что "Это сообщение выдается, когда первый элемент в With не является списком присваиваний символов". Учитывая это объяснение, я понимаю механику того, почему мое задание не удалось. Тем не менее, я в недоумении и задаюсь вопросом, является ли это необходимым ограничением со стороны WRI, или это незначительный недосмотр разработчиков, о котором следует сообщить.
Вот мой вопрос:
Может ли кто-нибудь пролить свет на это поведение и/или предложить обходной путь? Я экспериментировал с попытками принудительной оценки
, но безуспешно, и я не уверен, что еще можно попробовать.