Ошибка генерации локализованных переменных (как констант)

Сообщение об использовании для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без удачи, и я не уверен, что еще попробовать.

Ответы на вопрос(4)

Ваш ответ на вопрос