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

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

Вот мой вопрос:

Может ли кто-нибудь пролить свет на это поведение и/или предложить обходной путь? Я экспериментировал с попытками принудительной оценки, но безуспешно, и я не уверен, что еще можно попробовать.

7
задан telefunkenvf14 4 December 2011 в 05:34
поделиться