Как построить список из множества - PullRequest
3 голосов
/ 05 июня 2010

У меня есть большой набор параметров P, которые принимают несколько различных наборов значений V_i и хотят использовать ActionMenu[], чтобы упростить назначение P = V_i, например:

ActionMenu["Label", {"name_1" :> (P = V_1;),..}]

Теперь проблема в том, что набор V_i большой и не статический, поэтому вместо того, чтобы кодировать длинный список {"opt_1" :> (P = V_1;),..} снова и снова вручную, я бы хотел сгенерировать его.

Я совершенно ошеломлен тем, как это сделать. Общий подход - это что-то вроде

Thread@RuleDelayed[listOfNames,listOfActions]

где listOfActions должно быть что-то вроде

Thread@Set[repeatedListOfP,listOfV_i]

Но это не работает. А поскольку Set[] - это особая функция, ни один из моих обычных подходов не работает (построение Table[], замена заголовков и т. Д.). Как вы собираетесь построить список Set[] операций?

Ответы [ 2 ]

2 голосов
/ 05 июня 2010

Возможно, к вашему вопросу есть еще кое-что, что я еще не понял, но, может быть, это поможет вам выбрать правильный путь.

Это

MapThread[Hold[#1 = #2]&, {{a, b, c}, {1, 2, 3}}]

возвращает список неоцененных «множеств» следующим образом:

{Hold[a = 1], Hold[b = 2], Hold[c = 3]}

Если вы позвоните в ReleaseHold по поводу вышеизложенного, тогда назначения действительно произойдут.

Больше на удержании и родственники здесь:
Mathematica: Неоцененный против Отложенного против Удерживающего против Удерживающей Формы против Удерживающего Завершенного против и т.д.

1 голос
/ 15 июня 2010

Вот альтернативное решение, которое я использовал, когда хотел иметь RuleDelayed приложений с побочными эффектами. Вы используете другую голову, чтобы заменить Set, пока ваше выражение не окажется справа от формы RuleDelayed (где оно будет удерживаться атрибутом RuleDelayed HoldRest), а затем заменится Set обратно. Когда я делаю это, мне нравится использовать Module, чтобы создать для меня уникальный символ. Таким образом, вам не нужно использовать Defer, который является еще более неприятно скользкой конструкцией, чем Unevaluated.

Вот пример:

Module[{set},
 Attributes[set] = Attributes[Set];

 With[{rhs = MapThread[set, Unevaluated[{{x, y, z}, {1, 2, 3}}]]},
  "name1" :> rhs /. {set -> Set, List -> CompoundExpression}]]

Причина, по которой символу set присвоены те же атрибуты, что и Set, и причина, по которой Unevaluated присутствует, заключается в том, чтобы убедиться, что это работает, даже если кто-то уже присвоил значение x, y или z.

Другая возможность состоит в том, чтобы обернуть все ваши Set выражения как замыкания, а затем использовать Scan для их вызова при оценке RuleDelayed, например:

With[{thunks = MapThread[Function[{a, b}, (a = b) &, HoldAll],
    Unevaluated[{{x, y, z}, {1, 2, 3}}]]},
 "name1" :> Scan[#[] &, thunks]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...